SQL - 计算 TIME 之间的持续时间

SQL - Calculating duration between TIME

我有以下两个约会示例

第二个约会从晚上 7 点到午夜。然而,持续时间返回为 19 小时。这是因为日期未被存储,它计算的是晚上 7 点和前一晚午夜之间的差异。

约会只能安排到午夜,所以有没有一些 SQL 在选择假设下一个晚上而不是前一天晚上的午夜时将一天增加 1 天?这应该只有在时间是午夜时才有效,否则可以正常工作。

当前 SQL

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

from master_rota mr

嗯,别用了 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()

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

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

如果是半夜,则改为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

如果 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;