首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL -计算时间间隔

问SQL -计算时间间隔
EN

Stack Overflow用户
提问于 2017-01-24 22:35:54
回答 4查看 236关注 0票数 0

我有以下两个约会示例

​

​

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

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

当前SQL

代码语言:javascript
复制
select mr.AssignmentId, ABS(DATEDIFF(MINUTE, mr.AssignmentStart, mr.AssignmentEnd) /60.0) as Total

from master_rota mr

​

​

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-01-24 22:39:55

好吧,不要使用abs()

代码语言:javascript
复制
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;

实际上,我认为我更喜欢这个等价的版本:

代码语言:javascript
复制
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()。

票数 3
EN

Stack Overflow用户

发布于 2017-01-24 22:40:28

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

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2017-01-24 22:47:40

如果是午夜,改成第二天00:00:00

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41830871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档