T-SQL持续时间(小时):分钟:秒

时间:2011-08-03 15:49:02

标签: tsql duration

我有几个日期之间的平均持续时间(DATETIME格式)即。 1900-01-01 01:30.00.00。 如何将DATETIME转换为格式小时:分钟:秒,其中小时数可以超过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时,结果将是相同的 - 这是不正确的。

金问候, 马尔钦

4 个答案:

答案 0 :(得分:2)

在T-SQL中,日期时间恰好是小时数永远不会超过24的日期和时间,因为它会将其移动到第二天。您可以使用datepart将日期时间值分段并将它们视为整数,然后将它们重新加入到所需的字符串中。根据您的最终目标,您可能更适合在应用程序或表示层中执行此类工作,其中更多通用语言通常具有更强大的日期时间库以供使用。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

 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)一起使用 希望我指出你正确的方向。

答案 3 :(得分:0)

您无法将日期时间转换为处理非实际日期和时间。

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

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