【问题标题】:T-SQL duration in hours:minutes:secondsT-SQL 持续时间(小时:分钟:秒)
【发布时间】:2011-08-03 15:49:01
【问题描述】:

我有几个日期之间的平均持续时间(DATETIME 格式),即。 1900-01-01 01:30.00.00。 如何将 DATETIME 转换为格式 hours:minutes:seconds,其中小时可以超过 24 - 输出格式可以是 VARCHAR。

IE。

1 days 12 hours 5 minutes convert to 36:05:00
2 days 1 hour 10 minutes 5 seconds convert to 49:10:05

等等……

DECLARE @date1 DATETIME = '2011-08-03 13:30'
DECLARE @date2 DATETIME = '2011-08-03 13:00'
DECLARE @date3 DATETIME = '2011-08-03 14:00'
DECLARE @abc DATETIME = '2011-08-03 12:00'

select CAST(AVG(CAST(data-@abc as float)) as datetime)
from
(
    select 'data' as label, @date1 as data
union all
select 'data' as label, @date2 as data
union all
select 'data' as label, @date3 as data
) as a
group by label

我想得到 01:30:00 的结果,这意味着平均时间是 1 小时 30 分钟。

我试过了:

CONVERT(VARCHAR(10), CAST(AVG(CAST(data-@abc as float)) as datetime), 108)

但是我只得到 HH:MM:SS 中的时间部分。当我设置 @abc = 2011-08-02 时,结果将是相同的 - 这是不正确的。

国王的问候, 马辛

【问题讨论】:

    标签: tsql duration


    【解决方案1】:

    在 T-SQL 中,日期时间正是这样一个日期和时间,小时数永远不会超过 24,因为这会将其移至第二天。您可以使用 datepart 将日期时间值拼凑出来并将它们视为整数,然后将它们重新加入您想要的字符串中。根据您的最终目标,您最好在应用程序或表示层中执行此类工作,因为更通用的语言通常有更强大的日期时间库可供使用。

    【讨论】:

      【解决方案2】:
      select cast(cast(cast(t as float) *24 as int) as varchar) + right(convert(varchar,t, 20), 6)
      from(
      select cast(AVG(CAST(data-@abc as float)) as datetime) t
      from 
      ( 
          select 'data' as label, @date1 as data 
      union all 
      select 'data' as label, @date2 as data 
      union all 
      select 'data' as label, @date3 as data 
      ) as a 
      group by label 
      ) a
      

      结果:

      1:30:00
      

      【讨论】:

        【解决方案3】:

        我认为您需要编写一个标量值函数,该函数接受一个整数参数(以秒为单位的时间差)并根据需要对其进行格式化。例如,

         CREATE FUNCTION intToDateTime ( @time_in_secs BIGINT) RETURNS VARCHAR(30)
         AS 
         BEGIN
           DECLARE @retval VARCHAR(30);
           SET @retval = cast(@time_in_secs/(60*60) as varchar(10))+':'+
           cast( (@time_in_secs-@time_in_secs/(60*60)*3600)/60 as varchar(10))+':'+
           cast( (@time_in_secs-@time_in_secs/(60)*60) as varchar(10));
         return @retval;
        END
        

        此函数需要一些更改 - 您可能希望在 0-9 中显示前导零(例如,'00' 而不是此函数当前所做的 '0');您还需要以更好的方式处理负值。
        现在您可以将它与DATEDIFF(second, @val1,@val2) 一起使用。
        希望我为您指明了正确的方向。

        【讨论】:

          【解决方案4】:

          您不能将日期时间转换为处理非真实日期和时间。

          但是,您可以得到一个看起来像日期时间的输出,只需将小时字符串与 ':' 与分钟等连接起来。

          查找DATEADD() 和DATEDIFF() 函数...

          【讨论】:

            猜你喜欢
            • 2020-01-03
            • 1970-01-01
            • 1970-01-01
            • 2019-08-19
            • 2016-10-09
            • 1970-01-01
            • 1970-01-01
            • 2023-02-05
            • 2020-09-08
            相关资源
            最近更新 更多