700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Oracle判断时间段内的日期是否属于工作日

Oracle判断时间段内的日期是否属于工作日

时间:2020-11-23 08:13:50

相关推荐

Oracle判断时间段内的日期是否属于工作日

判断-1-1到-12-31这一年的时间,哪些属于工作日,哪些属于休息日。

查询SQL如下:

SELECT to_date('-01-01','yyyy-mm-dd')+rownum-1 w_date,CASE WHEN MOD(to_char(to_date('-01-01','yyyy-mm-dd')+rownum-1,'D'),6)=1 THEN '休息日' ELSE '工作日' END AS IF_WORKDAYfrom dual connect by rownum<to_date('/12/31','yyyy-mm-dd')-to_date('/01/01','yyyy-mm-dd')+2

执行结果:

这个结果是oracle数据库根据周六周日是休息日,周一至周五为工作日,这个逻辑来判断的,如果要作为实际的工作日、休息日、节假日的判断,还应在这个基础上进行调整,这个SQL可以生成初始化节假日数据表格。

对上面的SQL语句进行调整,便可以动态查询本年度1月1日至12月31日的情况:

今年第一天

select trunc(sysdate,'yyyy') FROM DUAL;

今年最后一天

select last_day(add_months(trunc(SYSDATE,'y'),11)) from dual;

结合上面的动态查询,原SQL可以更改为:

SELECT trunc(sysdate,'yyyy') +rownum-1 w_date,CASE WHEN MOD(to_char(trunc(sysdate,'yyyy') +rownum-1,'D'),6)=1 THEN '休息日' ELSE '工作日' END AS IF_WORKDAYfrom dual connect by rownum<last_day(add_months(trunc(SYSDATE,'y'),11))-trunc(sysdate,'yyyy')+2

执行结果跟修改前一样:

SQL解读:

TO_CHAR函数对日期格式化显示,'D'代表每周第几天(第一天是周日)。

SELECT TO_CHAR(SYSDATE,'D') FROM dual;

MOD函数用来求两个数值相除后的余数,这里巧妙运用每天的星期数对6取余运算,只有1和7对6取余后结果为1,1和7正好代表周日和周六,所以当结果为1表示‘休息日’,否则表示‘工作日’。

SELECT mod(1,6) a FROM dual;--1SELECT mod(2,6) a FROM dual;--2SELECT mod(3,6) a FROM dual;--3SELECT mod(4,6) a FROM dual;--4SELECT mod(5,6) a FROM dual;--5SELECT mod(6,6) a FROM dual;--0SELECT mod(7,6) a FROM dual;--1

connect by rownum 就相当于一个for循环的最后停止条件,并且自动的认为 rownum 从1开始循环,每次自动加1,在这个查询中就是循环一年所有天数。

末尾的+2,是因为两个日期相减后会少1,同时在计算w_date字段时,rownum-1,所以这里要+2,才能遍历出一整年的所有日期。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。