包含假日的Oracle日历

rwqw0loc  于 2023-03-01  发布在  Oracle
关注(0)|答案(2)|浏览(192)

我试图建立一个日历,它似乎是工作正常。我怎么能包括一个假日列与'Y'的假日和'N',如果不是假日。
在下面的测试用例中,我希望2月8日假期为“Y”,所有其他行为“N”

CREATE TABLE holidays (holiday_date) AS
SELECT TRUNC(SYSDATE, 'YY') + INTERVAL '39' DAY FROM DUAL

with calendar as (
        select rownum - 1 as daynum
        from dual
        connect by rownum <= to_date('28-feb-2023') - to_date('1-feb-2023') +1
    )
select to_date('1-feb-2023') + daynum as monthdate
from calendar;
o8x7eapl

o8x7eapl1#

我不确定holidays表的用途是什么,因为它只包含一行;然后,您有一个2023年2月的CTE(虽然不是 * 完美 *-如果您使用to_date,那么也应用格式模型),并且它不使用以前创建的holidays
无论如何:一个简单的选项是按原样创建calendar *(例如,对于2023年,直到 * 今天 *),并包括cb_holiday列(cb作为 * 复选框 *,其值为Y或N),默认为N,并在以后根据需要的日期进行更新。

SQL> create table calendar (datum, cb_holiday) as
  2    select trunc(sysdate, 'yy') + level - 1, 'N'
  3    from dual
  4    connect by level <= trunc(sysdate) - trunc(sysdate, 'yy') + 1;

Table created.

SQL> update calendar set
  2    cb_holiday = 'Y'
  3    where datum in (date '2023-02-08');

1 row updated.

SQL> select * From calendar
  2  where to_char(datum, 'yyyymm') = '202302'
  3  order by datum;

DATUM     C
--------- -
01-FEB-23 N
02-FEB-23 N
03-FEB-23 N
04-FEB-23 N
05-FEB-23 N
06-FEB-23 N
07-FEB-23 N
08-FEB-23 Y       --> here it is
09-FEB-23 N
10-FEB-23 N
11-FEB-23 N
<snip>
26-FEB-23 N
27-FEB-23 N
28-FEB-23 N

28 rows selected.

SQL>

如果您不想在单独的语句中使用update表,可以-您可以在create table中使用case表达式:

SQL> create table calendar (datum, cb_holiday) as
  2    select trunc(sysdate, 'yy') + level - 1,
  3      case when trunc(sysdate, 'yy') + level - 1 in (date '2023-02-08') then 'Y'
  4           else 'N'
  5      end
  6    from dual
  7    connect by level <= trunc(sysdate) - trunc(sysdate, 'yy') + 1;

Table created.
3yhwsihp

3yhwsihp2#

create table calendar (dt, holiday) as
      select trunc(sysdate, 'yy') + level - 1,
        case when trunc(sysdate, 'yy') + level - 1 in ( select  holiday_date
     from  holidays
      )   then 'Y'
             else 'N'
        end
      from dual
      connect by level <= trunc(sysdate) - trunc(sysdate, 'yy') + 1;

相关问题