sql日期 - 时间比较的人

时间:2016-10-11 14:42:27

标签: sql sql-server date time between

我想在没有厨师的情况下列出人员名单。

sql table:

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不工作时1工作的时间

像这样:

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 

在这个例子中,只有一个工人和一个厨师,但这必须扩展到几个工作男性和几个酋长

如何进行SQL查询来解决此问题。

1 个答案:

答案 0 :(得分: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)