如果分钟小于60,则从结果中删除小时部分

时间:2014-03-31 06:45:46

标签: sql sql-server-2008 stored-procedures

我有这样的功能:

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 @second=@dec % 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,只需要显示小时分钟......我怎么能这样做?我必须在我的功能中做出什么改变?任何帮助都非常明显..

1 个答案:

答案 0 :(得分: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)