2012-09-07 52 views
1

我有导演根据助理是否工作或者导演没有工作时支付佣工。SQL查询比较日期时间重叠并显示它们

有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.我希望简单的骨架分解就足够了。找到足够的查询来查看是否有人与时间冲突,但没有发现上述情况。

+0

我不知道,有人可以在发生什么事了,但我不明白你的结果的日期。也许更少的记录,更多的细节会有所帮助。即使发布你现在尝试过的内容也不错。 (它有助于了解表和现有查询是如何建立起来的) –

+0

帮助“属于”导演,你会如何知道这一点?如果没有这个,那么我想象一个导演的冲突与多于一个帮手的重叠时间。 –

+1

您确实应该将该结束时间戳存储并用作_exclusive_上限。把它想象成“这个人不在这里的第一个瞬间”,而不是“这个人在这里的最后一刻”。 –

回答

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