2014-03-31 111 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