如何在sql server中以时间格式(hh:mm:ss)计算两个日期时间字段(yyyy-mm-dd hh:mm:ss)之间的差异?

时间:2015-01-10 14:51:25

标签: sql-server datetime datediff dateadd datepart

我在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函数完成吗?

2 个答案:

答案 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”为前缀。这允许持续时间为负。

希望有所帮助