1

我在 sql server 的表中有 2 列 - [发生时间 (NT)] 和 [清除时间(NT)] 的格式为 yyyy-mm-dd hh:mm:ss,第三​​列 [Outage Duration] 的格式为hh:mm:ss

[标识符] | [发生时间(NT)] | [清关时间(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 格式计算 [Outage duration]。

一种可能的方法如下:

(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 函数来完成吗?

4

2 回答 2

1

你需要使用datediff功能。

首先找到两个日期之间的时间differenceseconds

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引用的转换hh:mm:ss

于 2015-01-10T14:56:35.247 回答
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

或者甚至将 [Outage Duration] 添加为 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”为前缀。这允许负持续时间。

希望有帮助

于 2015-01-10T21:55:42.807 回答