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

Tsql T-SQL持续时间(小时:分钟:秒),tsql,duration,Tsql,Duration,我有几个日期之间的平均持续时间(日期时间格式),即1900-01-01:30.00.00。 如何将DATETIME转换为小时:分钟:秒格式,其中小时可以超过24小时-输出格式可以是VARCHAR 即 等等 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

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

等等

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时,结果将是相同的-这是不正确的

国王问候, 马辛

结果:

1:30:00

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

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

但是,只需将小时字符串与“:”和分钟等连接起来,就可以获得类似于datetime的输出


查找
DATEADD()
DATEDIFF()
函数…

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

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

1:30:00
 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