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;
我有以下两个约会示例
第二个约会从晚上 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;