2014-03-31 43 views
0

我有這樣的功能:如果分鐘小於60然後取出小時部分從結果

ALTER FUNCTION [dbo].[testfunctionstacknew] (@dec NUMERIC(18, 2)) RETURNS Varchar(50) 
AS 
BEGIN 
DECLARE 
@hour decimal(18,2), 
     @Mns decimal(18,2), 
     @second decimal(18,3) 

DECLARE @Average Varchar(50) 
select @hour=CONVERT(int,@dec/60/60) 
SELECT @Mns = convert(int, (@dec/60) - (@hour * 60)); 
select @[email protected] % 60; 

SELECT @Average = 
     convert(varchar(9), convert(int, @hour)) + ':' + 
     -- right('00' + convert(decimal(10,0), convert(decimal(18,2), @hour)), 2) + ':' + 
    right('00' + convert(decimal(10,0), convert(decimal(18,2), @Mns)), 2) + ':' + 
    right('00' + CONVERT(decimal(10,0), convert(varchar(10), @second)), 6) 
RETURN @Average  

END 

,我有一個這樣的存儲過程:

select dbo.testfunctionstacknew(
      convert(decimal(10,1), 
       avg(convert(numeric(18,2), datediff(ss, t.dtime, t.PAICdate )))) 

     ) as Avgparkingtime from (select top 10 * from transaction_tbl where locid=6 and dtime >= getdate()-1 order by transactID desc) t 

在執行存儲的過程,如果平均時間不到60分鐘我得到這樣的結果:

Avgparkingtime : 
0:25:33   

如果平均時間是不到60分鐘,然後我不想在分鐘前得到零,(這次只需要顯示分鐘和秒)..只有一小時需要顯示分鐘是否大於60分鐘......我該怎麼辦這個?我必須在我的函數中做出什麼改變?任何幫助是非常可觀..

回答

0

嘗試改變你打造格式化字符串這樣的部分:

SELECT @Average = 
    case 
    when convert(int, @hour) <> 0 then convert(varchar(9), convert(int, @hour)) + ':' 
    else '' 
    end + 
    right('00' + convert(decimal(10,0), convert(decimal(18,2), @Mns)), 2) + ':' + 
    right('00' + CONVERT(decimal(10,0), convert(varchar(10), @second)), 6) 
+0

是,,它工作得很好....感謝ü – user3106114

+0

太好了!請記住儘可能將其標記爲答案! –

+0

先生,我還有一個疑問,我可以問嗎? – user3106114