原公司用的數據庫是Oracle和MySQL居多,寫的SQL語句也比較少,有些生疏了。如今的公司使用的DB2數據庫,徹底沒接觸過,致使一些函數的使用要在網上搜索案例,如今總結一點DB2的函數使用方法。數據庫
正確需求:查詢出指定日期的工做日,頁面傳一個天數,並返回一個新的日期。函數
下面是時間表字段: fetch
剛開始項目需求說的不清楚,致使查詢的結果不對,原來的需求只是說過濾掉週六週日休息時間和週一至週五存調休放假的時間,獲得上班的時間。.net
下面的SQL語句查出的是系統當前時間和一個指定日期這個區間的上班記錄,SQL函數說明:code
CURRENT DATE
:獲取系統當前日期,可是獲取的日期有/
鏈接,即:2017/11/30
,數據庫中的日期存儲分爲年月日三個字段,且爲字符型,這裏就須要用到相關函數對日期進行格式化。char(replace(char(date,iso),'-',''),8)
:轉成字符yyyymmdd
格式,將結果中的-
去掉後轉換成8位的字符。DECIMAL()
:也能夠去掉-
轉換成yyyymmdd
格式以上函數能夠參考此帖:http://bbs.csdn.net/topics/310260682get
select * from SAPHEC.ZCALDER a where (a.MANDT='720' and a.LANG='zh' --and a.YR='2017' --and a.mth='09' and a.ZDAYS!='1' and a.ZDAYS!='7' and a.off_srt!='Y' AND A.YR||A.MTH||A.ZDAY BETWEEN char(replace(char(CURRENT DATE,iso),'-',''),8) AND '20180101') union all (select * from SAPHEC.ZCALDER a where a.OFF_SRT='N' and a.LANG='zh' --and a.YR='2017' and a.MANDT='720' -- and a.mth='09' AND A.YR||A.MTH||A.ZDAY BETWEEN char(replace(char(CURRENT DATE,iso),'-',''),8) AND '20180101');
根據正確需求,返回一個日期,正確的SQL語句以下:io
rownumber() over()
:對重複的字段進行分組(相似group by),並生成一個序列select DATE from (select DATE, ZDAYS, OFF_SRT, rownumber() over() as row_count from( --查詢出2017年以後週末上班的數據 select YR||MTH||ZDAY AS DATE, ZDAYS, OFF_SRT from saphec.ZCALDER where MANDT='720' and LANG='zh' AND YR||MTH||ZDAY > '20170101' and OFF_SRT = 'N' and (ZDAYS = '1' OR ZDAYS = '7') union --查詢出2017年以後的上班日,不包含週六週日 select YR||MTH||ZDAY AS DATE, ZDAYS, OFF_SRT from saphec.ZCALDER where MANDT='720' and LANG='zh' AND YR||MTH||ZDAY > '20170101' and OFF_SRT <> 'Y' AND ZDAYS IN ('2','3','4','5','6')) order by DATE fetch first 30 rows only) where row_count = 30;