2016-10-11 62 views
1

我想列出一个没有大厨时工作的人。sql日期时间比较人

SQL表:

people_id clock_in    clock_out 
1   2016-10-10 06:58:01.000 2016-10-10 14:59:01.000 
1   2016-10-11 06:57:02.000 2016-10-11 14:58:23.000 
.. 
2   2016-10-10 07:51:01.000 2016-10-10 13:00:01.000 

People_id:1 =正常工作的人,2 =厨师在这个例子中

现在我想显示的时间是1时,工作时,2是不是有

像这样:

people_id start_working_without_chef end_working_without_chef 
1   2016-10-10 06:58:01.000 2016-10-10 07:51:01.000 
1   2016-10-10 13:00:01.000 2016-10-10 14:59:01.000 

在这个例子中,只有一个人工作,一个通道EF但是这必须扩展到serveral的工作男子和serveral的酋长

我怎样才能使一个SQL查询来解决这个问题。

+0

最后一行('people_id = 2')时间在第一排时间之间,这并不意味着厨师在正常工作时工作吗? –

+0

您可以添加更多行样本表数据,并调整预期结果吗? – jarlh

+0

@a_horse_with_no_name sql 2008 r2 – Scaver

回答

0

以及它不是真正的“好”看,我会尽力,明天找到一个更好的解决方案。

create table tt (id int, dte_in timestamp, dte_out timestamp); 

insert into tt values (1, timestamp('2016-10-10-06.58.01'), timestamp('2016-10-10-14.59.01')); 
insert into tt values (1, timestamp('2016-10-11 06:57:02'), timestamp('2016-10-11 14:58:23')); 
insert into tt values (1, timestamp('2016-10-12 06:57:02'), timestamp('2016-10-12 14:58:23')); 
insert into tt values (1, timestamp('2016-10-13 06:57:02'), timestamp('2016-10-13 14:58:23')); 
insert into tt values (1, timestamp('2016-10-14 06:57:02'), timestamp('2016-10-14 14:58:23')); 
insert into tt values (2, timestamp('2016-10-10 07:51:01'), timestamp('2016-10-10 13:00:01')); 
insert into tt values (2, timestamp('2016-10-12 05:57:02'), timestamp('2016-10-12 15:58:23')); 
insert into tt values (2, timestamp('2016-10-13 05:57:02'), timestamp('2016-10-13 12:58:23')); 
insert into tt values (2, timestamp('2016-10-14 10:57:02'), timestamp('2016-10-14 16:58:23')); 


select a.id, 
a.dte_in, 
b.dte_in 
from tt a 
inner join tt b on b.id = 2 and b.dte_in between a.dte_in and a.dte_out 
where a.id = 1 
union all 
select a.id, 
b.dte_out, 
a.dte_out 
from tt a 
inner join tt b on b.id = 2 and b.dte_out between a.dte_in and a.dte_out 
where a.id = 1 
union all 
select a.id, a.dte_in, a.dte_out 
from tt a 
where a.id = 1 and not exists (select 1 from tt b where b.id = 2 and b.dte_in between a.dte_in and a.dte_out) 
and not exists (select 1 from tt b where b.id = 2 and a.dte_in between b.dte_in and b.dte_out) 
+0

感谢您的输入!但我怎么能做到这一点,以便我有一群我想与一群厨师进行比较的人。所以我可以展示有人在没有任何厨师的情况下工作的时间。 – Scaver