【问题标题】:How to calculate difference between two datetime fields (yyyy-mm-dd hh:mm:ss) in time format (hh:mm:ss) in sql server?如何在sql server中以时间格式(hh:mm:ss)计算两个日期时间字段(yyyy-mm-dd hh:mm:ss)之间的差异?
【发布时间】:2015-03-08 18:34:08
【问题描述】:

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

【问题讨论】:

    标签: sql-server datetime datediff dateadd datepart


    【解决方案1】:

    你需要使用datediff函数。

    首先在seconds中找到两个日期之间的difference

    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 
    

    参考:从这个link引用的secondshh:mm:ss的转换

    【讨论】:

      【解决方案2】:

      好旧的 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 中添加 [Outage Duration] 作为计算字段

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

      希望有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-18
        • 1970-01-01
        • 1970-01-01
        • 2019-09-15
        • 1970-01-01
        • 2014-01-03
        • 2023-03-30
        • 1970-01-01
        相关资源
        最近更新 更多