Oracle 日历表详解(含节假日)

1 概述

日历
双休日
每周的第一天:周日(而非周一)
今天:to_char(sysdate, 'D')
1-7:周天 - 周六(默认)
按需选择
今天:to_char(sysdate - 1, 'D')
1-7:周1 - 周天(习惯)
节假日
特殊判断:记录在 table 中 或 使用其它工具,如: Python

节假日 是国务院每年维护的,所以需要特殊判断

2 示例

2.1 判断双休日

-- 2022 年全年: 364 天
select date '2022-12-31' - date '2022-01-01' 天数 
 from dual;
 
-- 系统默认 和 日常使用习惯
select to_char(sysdate, 'D') 默认天, 
       to_char(sysdate - 1, 'D') 习惯天 
  from dual;

-- 核心逻辑
select date '2022-01-01' + rownum - 1 日期,
       to_char(date '2022-01-01' + rownum - 2, 'D') 星期几
  from dual
connect by rownum <= 364;

2.2 判断节假日

with t_date_base as
 ( -- 一般日
  select date '2022-01-01' + rownum - 1 日期,
         to_char(date '2022-01-01' + rownum - 2, 'D') 星期几
    from dual
  connect by rownum <= 364),
t_date_jjr as
 ( -- 节假日
  select date '2022-01-29' 日期, '补班' 日期类型 from dual
  union all
  select date '2022-01-30' 日期, '补班' 日期类型 from dual
  union all
  select date '2022-01-31' 日期, '除夕' 日期类型 from dual
  union all
  select date '2022-02-01' 日期, '春节' 日期类型 from dual)
select t1.日期,
       t1.星期几,
       (case -- 注意顺序
         when t2.日期 is not null and t2.日期类型 <> '补班' then 
          '节假日'
         when t2.日期 is not null and t2.日期类型 = '补班' then 
          '工作日'
         when t1.星期几 in ('6', '7') then
          '节假日' -- 双休日
         else
          '工作日'
       end) 日期类型
  from t_date_base t1,
       t_date_jjr  t2
 where t2.日期(+) = t1.日期
 order by t1.日期;

查询结果:(部分)

日期  		星期几	日期类型
2022/1/24	1		工作日
2022/1/25	2		工作日
2022/1/26	3		工作日
2022/1/27	4		工作日
2022/1/28	5		工作日
2022/1/29	6		工作日
2022/1/30	7		工作日
2022/1/31	1		节假日
2022/2/1	2		节假日

3 扩展

3.1 Python 输出节假日

import datetime
import chinese_calendar


def get_holidays(year=None, include_weekends=True):
    """
    获取某一年的所有节假日,默认当年
    :param year: which year
    :param include_weekends: False for excluding Saturdays and Sundays
    :return: list
    """
    # 若 year 为空,则默认当年
    if not year:
        year = datetime.datetime.now().year

    # 开始时间
    start = datetime.date(year, 1, 1)
    # 结束时间
    end = datetime.date(year, 12, 31)
    # 假节日
    holidays = chinese_calendar.get_holidays(start, end, include_weekends)
    return holidays


if __name__ == '__main__':
    date_test = get_holidays()
    for day in date_test:
        print(day)

3.2 遍历月份

select add_months(to_date('2023-01', 'YYYY-MM'), level - 1) as month, level
  from dual
connect by level <=
           months_between(to_date('2023-11', 'YYYY-MM'),
                          to_date('2023-01', 'YYYY-MM')) + 1;

在这里插入图片描述

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼丸丶粗面

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值