简体   繁体   English

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

[英]SQL - Calculating duration between TIME

I have the below two example appointments 我有以下两个约会示例

在此处输入图片说明

The second appointment runs from 7PM to Midnight. 第二次约会从晚上7点到午夜。 However the duration comes back as 19 hours. 但是持续时间为19小时。 This is due to the date not being stored and it calculating the differnence between 7PM and midnight of the previous night. 这是由于未存储日期,并且它计算了晚上7点与前一天晚上的午夜之间的差异。

Appointments can only be scheduled up to Midnight anyway, so is there some SQL that will increase the day by 1 day when selecting to assume its midnight of the upcoming night and not the night before? 约会只能安排在午夜之前进行,因此,当选择假定即将到来的夜的午夜而不是前夜的午夜时,是否有一些SQL可以将日期增加1天? This should only be affective when the time is midnight, otherwise it works fine. 仅当时间是午夜时这才有意义,否则就可以正常工作。

Current SQL 当前SQL

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

from master_rota mr

在此处输入图片说明

Well, don't use abs() : 好吧,不要使用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;

Actually, I think I prefer this equivalent version: 实际上,我认为我更喜欢这个等效版本:

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;

It has the datediff() in only one place. 它只有一个位置具有datediff()

You should get your application doing the inserts to actually do the correct insert logic. 您应该让您的应用程序执行插入操作,以实际执行正确的插入逻辑。 However, it seems like this could be a workaround: 但是,看来这可能是一种解决方法:

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

If it is midnight, change to 00:00:00 the next day 如果是午夜,第二天更改为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

Just add a day if AssignmentEnd is midnight (00:00). 如果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;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM