1

我有董事根据助手是否工作而向其支付报酬。

有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。我希望简单的简单分解就足够了。找到足够多的查询来查看是否有人与时间冲突,但没有细分上述内容。

4

1 回答 1

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
于 2012-09-07T20:48:37.097 回答