SQL优化之--日期时间段的读取

时间:2021-08-01 11:24:42

需求:
有一个职员历史表,表里有职员考勤组,生效开始日期,生效结束日期,然后我要取出指定时间段的考勤组。PS:每条历史记录的生效开始日期都会对应一个考勤组,也就是从生效开始日期开始使用对应的考勤组进行计算考勤,比如有如下几条数据:

考勤组       生效开始日期      生效结束日期
A 2015-06-09 2017-01-10
B 2016-01-11 2017-07-03
C 2017-07-04 2017-07-15
D 2017-07-16 2999-12-31

方案1:
然后现在我要通过sql得出2017-07月这段时间每天的考勤组。根据表中的数据可以得出2017-07-01至2017-07-03是B考勤组,2017-07-04至2017-07-15是C考勤组,2017-07-16至2017-07-31是D考勤组。
所以SQL语句就应该先根据生效开始日期得出处于2017-07-01至2017-07-31之间的考勤组,再union得出离2017-07-01最近的一次生效日期的考勤组。

select * from EmployeeShiftHistory where FEffectiveStartDate between '2017-07-01' and '2017-07-31' 
union
select top 1 * from EmployeeShiftHistory where FEffectiveStartDate < '2017-07-01' order by FEffectiveStartDate desc;

然后再关联日期表(存了每天的日期、星期)就可以得出每天的考勤组了。

方案2:
直接得出生效结束日期 >= ‘2017-07-01’ 并且生效开始日期 <= ‘2017-07-31’的值

select * from EmployeeShiftHistory where FEffectiveEndDate >= '2017-07-01' and FEffectiveStartDate <= '2017-07-31' ;

这样就不用union了,而且SQL也更简洁。