之前在網路查詢了一下關於使用sql 查詢 「幾個工作日之後的日期」的問題,大意就是,假設今天是週三(2014/08/27),三個工作日之後(包含週三)就是周五(20140929),四個工作日之後,就是下周一(20140901),如果遇到法定節假日,則當週末處理(如周一是中秋節,則周一不算是工作日)。看了好幾個答覆,感覺實現起來都挺複雜的,今天學到一種比較簡單的處理方法,希望對你有好處。
建立乙個時間表 sjb,格式如下:
日期(tjrq)節假日型別(type)
yyyymmdd
0 工作日,1 正常週末,2 節假日。
節假日,可以是法定節假日,也可以自定義的特殊節假日。
對於時間表,我們需要在資料庫預先設定整一年或幾年的資料,那對於查詢出(今天)三個工作日之後的日期,其實就是查詢日期型別為 1,往後的第三條資料即可,為了在效率上更快,可以考慮分頁來實現。如在 oracle 上的查詢可以是:(在實際實現中,往往需要傳入今天的日期(20140828),第幾個工作日 3)
select * from ( select r.*, rownum rn from (
select tjrq from sjb where tjrq >= 20140828 and type= 0 order by tjrq asc
)r where rownum<=3 )pg where pg.rn= 3
在 mysql 上的查詢如下:
select tjrq from sjb where tjrq >= 20140828 and type= 0 order by tjrq asc limit 3,1
鑑於需要預先初始化資料,需要占用一定的資料庫空間,不過一年才 300 多條資料,這樣的儲存空間,不在考慮範圍之類。
sql計算工作日函式
這個演算法還不夠嚴謹,沒有考慮到周 六 日調換假期等細節的情況。1 建節假日表 create table holiday id int identity 1,1 not null name nvarchar 50 collate chinese prc ci as not null begindat...
SQL實現工作日計算
create function time span of minutes start day datetime,end day datetime returns float begin 返回按分鐘計算兩段時間的間隔,採用逐日靠近的方法求解,一天按8小時480分鐘計算,週末不計,不考慮法定節假日。如果...
(Oracle)取當前日期的最近工作日
描述 現有一需求,日期表中存放了日期和是否節假日 0 工作日,1 節假日 現在需要取日期表中的最近的工作日。如2017 07 23 週日 最近的工作日應該是2017 07 21 周五 date d is holiday 1 2017 7 17 0 2 2017 7 18 0 3 2017 7 19 ...