SQL優化之 日期時間段的讀取

2021-08-04 16:04:40 字數 1161 閱讀 8406

需求:

有乙個職員歷史表,表裡有職員考勤組,生效開始日期,生效結束日期,然後我要取出指定時間段的考勤組。ps:每條歷史記錄的生效開始日期都會對應乙個考勤組,也就是從生效開始日期開始使用對應的考勤組進行計算考勤,比如有如下幾條資料:

考勤組       生效開始日期      生效結束日期

a 2015-06-09

2017-01-10

b 2016-01-11

2017-07-03

c2017-07-04

2017-07-15

d2017-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也更簡潔。

Sql中,按時間段取資料(時間段不包括日期)

select count kqres res from t kqresult where staff id 24 and kqres res 年假說明 and kqres date 2007 10 01 and kqres date 2007 10 31 and t kqexplain.kqe st...

SQL時間段查詢

access的話 select from table where date1 2008 1 20 and date2 2007 8 30 mysql的話 select from table where date1 2008 1 20 and date2 2007 3 30 也可以 select fr...

SQL時間段查詢

sql時間段查詢 access的話 select from table where date1 2008 1 20 and date2 2007 8 30 mysql的話 select from table where date1 2008 1 20 and date2 2007 3 30 也可以 ...