db2取数据库日期时间_对DB2系统当前日期进行格式化

原公司用的数据库是Oracle和MySQL居多,写的SQL语句也比较少,有些生疏了。现在的公司使用的DB2数据库,完全没接触过,导致一些函数的使用要在网上搜索案例,现在总结一点DB2的函数使用方法。

正确需求:查询出指定日期的工作日,页面传一个天数,并返回一个新的日期。

下面是时间表字段:

表名字段中文说明备注

ZCALDER

MANDT

客户端

判断登陆的系统是否为测试系统

LANG

语言

判断语言

YR

年份

MTH

ZDAY

ZDATE

日期

ZDAYS

星期

周日是1,周六是7,周一至周五是2至6

OFF_SRT

自定休假区分

是否放假,上班N,放假Y

HLDY_YN

公休日有无

YR_WEEK

年份

WEEK_NO

周次

CAL_RMK

备注

刚开始项目需求说的不是很清楚,导致查询的结果不对,原来的需求只是说过滤掉周六周日休息时间和周一至周五存调休放假的时间,得到上班的时间。

下面的SQL语句查出的是系统当前时间和一个指定日期这个区间的上班记录,SQL函数说明:

CURRENT DATE:获取系统当前日期,但是获取的日期有 - 连接即:2017-11-30,数据库中的日期存储分为年月日三个字段,且为字符型,这里就需要用到相关函数对日期进行格式化。

char(replace(char(date,iso),’-‘,”),8):转成字符yyyymmdd格式,将结果中的短横去掉后转换成8位的字符。

DECIMAL():也可以去掉 - 转换成yyyymmdd格式

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语句如下:

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;


版权声明:本文为weixin_42651281原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。