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

Sql 如果分钟数小于60,则从结果中删除小时数部分,sql,sql-server-2008,stored-procedures,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,@

我有这样一个函数:

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   
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)
我有这样一个存储过程:

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   
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)
在执行存储过程时,如果平均时间小于60分钟,则得到如下结果:

Avgparkingtime  :
0:25:33          

如果平均时间小于60分钟,那么我不想在分钟前得到零,(这个时间只需要显示分和秒)…如果分钟大于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 @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   
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)
SELECT@Average=
案例
当convert(int,@hour)0时,则convert(varchar(9),convert(int,@hour))+':'
否则“
完+
右('00'+转换(十进制(10,0),转换(十进制(18,2),@Mns)),2)+':'+
右('00'+转换(十进制(10,0),转换(varchar(10),@second)),6)

太棒了!如果可能,请记住将其标记为答案!先生,我还有一个疑问,我能问一下吗?如果我们现在有1小时的时间显示1,我必须显示01。如果有5分钟的时间显示5,我必须显示05。使用这个-
RIGHT('00'+CAST(columnname AS VARCHAR(2)),2)
。这将以前导零显示小于10的值。当我更新时,我遇到错误:算术溢出错误将数值转换为数据类型varchar。