原公司用的数据库是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;