我有几个日期之间的平均持续时间(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时,结果将是相同的 - 这是不正确的。
金问候, 马尔钦
答案 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()
函数...