【问题标题】:SQL - Calculating duration between TIMESQL - 计算 TIME 之间的持续时间
【发布时间】:2017-01-24 14:35:54
【问题描述】:

我有以下两个约会示例

第二次约会从晚上 7 点到午夜。然而,持续时间恢复为 19 小时。这是因为没有存储日期,它计算的是前一天晚上 7 点和午夜之间的差异。

约会只能安排到午夜时分,所以有些SQL会在选择即将到来的午夜而不是前一天晚上的午夜时增加一天的时间吗?这应该只在时间是午夜时有效,否则它工作正常。

当前 SQL

select mr.AssignmentId, ABS(DATEDIFF(MINUTE, mr.AssignmentStart, mr.AssignmentEnd) /60.0) as Total

from master_rota mr

【问题讨论】:

  • 为什么应用程序没有将结束时间设置为正确的日期时间?或者这些 TIME 列是否被格式化为屏幕截图中的日期时间列?
  • 您知道午夜 (00:00:00) 是一天的开始,而不是一天的结束,对吧?

标签: sql sql-server sql-server-2008 time duration


【解决方案1】:

好吧,不要使用abs()

select mr.AssignmentId,
       (case when mr.AssignmentStart < AssignmentEnd
             then DATEDIFF(MINUTE, mr.AssignmentStart, mr.AssignmentEnd) / 60.0
             else 24 + DATEDIFF(MINUTE, mr.AssignmentStart, mr.AssignmentEnd) / 60.0
        end) as Total
from master_rota mr;

其实我觉得我更喜欢这个等价的版本:

select mr.AssignmentId,
       (DATEDIFF(MINUTE, mr.AssignmentStart, mr.AssignmentEnd) / 60.0 + 
        (case when mr.AssignmentStart < AssignmentEnd then 0 else 24 end)
       ) as Total
from master_rota mr;

它只有一个地方有datediff()

【讨论】:

    【解决方案2】:

    您应该让您的应用程序执行插入以实际执行正确的插入逻辑。但是,这似乎是一种解决方法:

    SELECT mr.AssignmentId
         , DATEDIFF(MINUTE, mr.AssignmentStart, 
             CASE WHEN mr.AssignmentEnd < mr.AssignmentStart THEN mr.AssignmentEnd + 1 ELSE mr.AssignmentEnd END) /60.0 as Total    
    FROM master_rota mr
    

    【讨论】:

    • 是的,你的权利,我修改了插入来做到这一点,而不是在 SQL 中做到这一点
    【解决方案3】:

    如果是午夜,则改为次日00:00:00

    select ABS(DATEDIFF(MINUTE, mr.AssignmentStart, iif(mr.AssignmentEnd='1900-01-01 00:00:00', '1900-01-02 00:00:00', mr.AssignmentEnd )) /60.0) as Total
    
    from #temp mr
    

    【讨论】:

      【解决方案4】:

      如果 AssignmentEnd 是午夜 (00:00),只需添加一天。

      SELECT mr.AssignmentId,
          CASE WHEN mr.AssignmentEnd = '00:00'
               THEN DATEDIFF(MINUTE, mr.AssignmentStart, DATEADD(DAY, 1, mr.AssignmentEnd)) / 60.0
               ELSE DATEDIFF(MINUTE, mr.AssignmentStart, mr.AssignmentEnd) / 60.0
          END AS Total
      from master_rota mr;
      

      【讨论】:

        猜你喜欢
        • 2011-06-26
        • 1970-01-01
        • 2016-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多