SQL查询比较日期时间重叠并显示它们

时间:2012-09-07 15:28:39

标签: sql sql-server-2008

我有导演根据导演的帮助是否有效来支付佣工。

有2个观点如下: -

Name    TimeIn                      TimeOut

Bob     2012-07-17 07:00:00.000     2012-07-17 16:00:00.000
Sam     2012-07-17 10:00:00.000     2012-07-17 20:00:00.000
Beatly  2012-07-17 14:00:00.000     2012-07-17 23:00:00.000
Mac     2012-07-17 21:00:00.000     2012-07-18 07:00:00.000 

辅助

Name    TimeIn                      TimeOut
Fred    2012-07-17 15:59:00.000     2012-07-18 00:19:00.000

现在弄清楚谁在那个时间工作并不是困难的部分,或者至少它不是我脑子里有问题的部分。什么是找到哪个和什么分钟以及由谁重叠的分钟。并按照使用的时间将它们组合在一起。因为他们都将与抄写员分摊小时工资。理想情况下,结果如下。

DirName HelperStart                 HelperEnd
Bob     2012-07-17 15:59:00.000     2012-07-17 16:00:00.000
Sam     2012-07-17 15:59:00.000     2012-07-17 16:00:00.000
Beatly  2012-07-17 15:59:00.000     2012-07-17 16:00:00.000
Sam     2012-07-17 16:01:00.000     2012-07-17 20:00:00.000
Beatly  2012-07-17 16:01:00.000     2012-07-17 20:00:00.000
Beatly  2012-07-17 20:01:00.000     2012-07-17 21:00:00.000
Beatly  2012-07-17 21:01:00.000     2012-07-17 23:00:00.000
Mac     2012-07-17 21:01:00.000     2012-07-17 23:00:00.000
Mac     2012-07-17 23:01:00.000     2012-07-18 00:19:00.000

使用SQL server 2008.我希望简单的细分就足够了。找到足够的查询,看看是否有人与时间冲突,但没有细分上述。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,这只是一个“简单”连接,您使用重叠的时间间隔。第二部分是测量助手与导演时间重叠的时间。这段时间从导演和助手TimeIn的后期开始,到他们TimeOut的早期结束。

我认为以下查询捕获了这个逻辑:

select d.name as DirectorName, h.name as HelperName,
       (case when d.timeIn > h.timeIn then d.timeIn else h.timeIn end) as HelperStart,
       (case when d.timeOut > h.timeOut then h.timeOut else d.timeOut end) as HelperEnd
from director d join
     helper h
     on d.timeIn < h.timeOut and
        d.timeOut >= h.timeIn