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

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

查询SQL如下:

 SELECT to_date('2023-01-01','yyyy-mm-dd')+rownum-1 w_date,
 CASE WHEN MOD(to_char(to_date('2023-01-01','yyyy-mm-dd')+rownum-1,'D'),6)=1 THEN '休息日' ELSE '工作日' END AS IF_WORKDAY
 from dual  
 connect by rownum<to_date('2023/12/31','yyyy-mm-dd')-to_date('2023/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_WORKDAY
from 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;--1
SELECT mod(2,6) a FROM dual;--2
SELECT mod(3,6) a FROM dual;--3
SELECT mod(4,6) a FROM dual;--4
SELECT mod(5,6) a FROM dual;--5
SELECT mod(6,6) a FROM dual;--0
SELECT mod(7,6) a FROM dual;--1

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

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

猜你喜欢

转载自blog.csdn.net/liangmengbk/article/details/129782300