我在sql server中的表中有2列 - [发生时间(NT)]和[清除时间(NT)]格式为yyyy-mm-dd hh:mm:ss和第三列[停机时间]格式为hh:mm:ss
[标识符] | [发生时间(NT)] | [清关时间(新台币)] | [停电时间]
4 | 2014-12-28 15:06:33.000 | 2014-12-28 15:18:18.000 | 00:11:45.000
停电持续时间计算为[发生时间(NT)]和[清除时间(NT)]的差异 目前我的代码如下:
select distinct a.[Identifier]
,a.[Occurrence Time(NT)]
,a.[Clearance Time(NT)]
,cast((cast(a.[Clearance Time(NT)] as datetime) - cast(a.[Occurrence Time(NT)]as datetime)) as time )
as [Outage Duration]
from final_report_2 a
强制转换只是故障保护,因为这两列都已经是日期时间。此代码适用于[发生时间(NT)]和[清除时间(NT)]在同一天下降的所有情况,即停电时间在24小时内
例如上面的行号。 4都是第28天,因此正确计算中断。
但是在不同日期的情况下错误地计算停电持续时间。
2678 | 2014-12-28 12:50:04.000 | 2014-12-31 23:59:59.000 | 11:09:55.000
在第2678行,时间应该是83:09:55而不是11:09:55。
因此我需要考虑天数的差异,然后以hh:mm:ss格式计算[停电持续时间]。
执行此操作的可能方法之一如下:
(23:59:59 - 12:50:04)+ 00:00:01 +((31-28-1)* 24):00:00 + 23:59:59
第一部分计算第一天的时间,然后第二部分计算第一部分。在[发生时间(NT)]和[清除时间(NT)]之间的整天,将它乘以24,最后一部分代表最后一天的时间。
如何在sql server中实现上述功能?可以使用DATEPART或DATEADD函数完成吗?
答案 0 :(得分:1)
您需要使用datediff
功能。
首先在两个日期之间找到difference
中的seconds
。
select Datediff(SECOND, [Clearance Time(NT)], [Occurrence Time(NT)])
现在使用此代码将seconds
转换为hh:mm:ss
。
DECLARE @TimeinSecond INT
SET @TimeinSecond = 86399 -- Change the seconds
SELECT RIGHT('0' + CAST(@TimeinSecond / 3600 AS VARCHAR),2) + ':' +
RIGHT('0' + CAST((@TimeinSecond / 60) % 60 AS VARCHAR),2) + ':' +
RIGHT('0' + CAST(@TimeinSecond % 60 AS VARCHAR),2)
更改您的查询。
SELECT DISTINCT a.[Identifier],
a.[Occurrence Time(NT)],
a.[Clearance Time(NT)],
RIGHT('0' + Cast(Datediff(SECOND, [Clearance Time(NT)],[Occurrence Time(NT)]) / 3600 AS VARCHAR), 2)
+ ':'
+ RIGHT('0' + Cast((Datediff(SECOND, [Clearance Time(NT)],[Occurrence Time(NT)]) / 60) % 60 AS VARCHAR), 2)
+ ':'
+ RIGHT('0' + Cast(Datediff(SECOND, [Clearance Time(NT)],[Occurrence Time(NT)]) % 60 AS VARCHAR), 2) [Outage Duration]
FROM final_report_2 a
参考:将seconds
转换为此{strong> link
hh:mm:ss
答案 1 :(得分:0)
旧的SQL DATEDIFF。 这是我使用的持续时间功能。全部包含在UDF中。
CREATE FUNCTION fDuration(@DtStart DATETIME, @DtEnd DATETIME)
RETURNS VARCHAR(10)
AS
BEGIN
RETURN (
SELECT
CONVERT(VARCHAR(10), t.Hours) + ':' +
RIGHT('00' + CONVERT(VARCHAR(10), t.Minutes), 2) + ':' +
RIGHT('00' + CONVERT(VARCHAR(10), t.Seconds - (t.Hours * 60 * 60) - (t.Minutes) * 60), 2) as Value
FROM (
SELECT
t.Hours,
ABS(t.Seconds / 60 - (t.Hours * 60)) as Minutes,
t.Seconds
FROM (
SELECT
DATEDIFF(SECOND, @DtStart, @DtEnd) as Seconds,
DATEDIFF(SECOND, @DtStart, @DtEnd)/60/60 AS Hours) t
) t)
END
用法:
SELECT dbo.fDuration('2014-12-28 12:50:04.000', '2014-12-31 23:59:59.000')
退货:
83:09:55
在您的情况下,您可以像这样修改您的查询
SELECT DISTINCT a.[Identifier],
a.[Occurrence Time(NT)],
a.[Clearance Time(NT)],
dbo.fDuration(a.[Occurrence Time(NT)], a.[Clearance Time(NT)]) as [Outage Duration]
FROM final_report_2 a
甚至可以将[中断持续时间]添加为final_report_2中的计算字段,公式为
dbo.fDuration([Occurrence Time(NT)],[Clearance Time(NT)])
然后它变成一个简单的选择......
SELECT DISTINCT a.[Identifier],
a.[Occurrence Time(NT)],
a.[Clearance Time(NT)],
a.[Outage Duration]
FROM final_report_2 a
请注意 小时不以“0”为前缀。这允许持续时间为负。
希望有所帮助