对DB2系统当前日期进行格式化

本文介绍了在DB2数据库中如何格式化当前日期,以满足特定查询需求。在处理日期时,作者遇到从系统获取的日期需要转换为特定格式的问题。通过使用`CURRENT DATE`函数获取当前日期,并结合`CHAR`和`REPLACE`函数进行格式化,将日期从'2017-11-30'形式转换为字符型'20171130'。同时提到了`DECIMAL()`函数也能实现相同效果。文章还提及了`ROWNUMBER() OVER()`在处理重复字段时的作用,用于生成序列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

下面是时间表字段:

字段中文说明备注
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格式

以上函数可以参考此帖:http://bbs.youkuaiyun.com/topics/310260682

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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值