【问题标题】:Create a table to have only working days excluding weekends and public holidays创建一个只有工作日的表,不包括周末和公共假期
【发布时间】:2021-10-20 12:57:45
【问题描述】:

我有 2 张桌子。

其中第一个包含每个月的工作日(年 = 2020):

Month Date from Date to
January 01/01/2020 31/01/2020
February 01/02/2020 29/02/2020
March 01/03/2020 31/03/2020

其中第二个日期为 2020 年公共假期,格式如下:

Date Week day Code Working hours
01/01/2020 Wednesday Holiday 0
08/03/2020 Sunday Holiday 0
01/09/2020 Tuesday Holiday 0
24/12/2020 Thursday Holiday 0

我想创建 1 个表(格式为 2nd 表),其中只有工作日的数据,不包括 2nd 表中的公共假期和 2020 年日历中的周末。

提前感谢您的帮助。

问候,

【问题讨论】:

  • “应该使用 PL/SQL 来完成”是什么意思? PL/SQL 是 Oracle 的过程语言。如果你想创建一个表,那么这只是一个 SQL 查询,而不是 PL/SQL。
  • 是的,你是对的。应该是SQL查询

标签: sql oracle


【解决方案1】:

您可以使用以下方法创建表:

CREATE TABLE working_days (
  day           DATE PRIMARY KEY,
  week_day      VARCHAR2(9)
                GENERATED ALWAYS AS (CAST(RTRIM(TO_CHAR(day, 'FMDay')) AS VARCHAR2(9))),
  code          VARCHAR2(20),
  working_hours NUMBER(4,2)
);

然后使用插入数据:

INSERT INTO working_days (day, code, working_hours)
WITH days (dt, date_to) AS (
  SELECT TRUNC(date_from),
         date_to
  FROM   working_day_ranges
UNION ALL
  SELECT dt + INTERVAL '1' DAY,
         date_to
  FROM   days
  WHERE  dt + INTERVAL '1' DAY <= date_to
)
SELECT dt, 'Working Day', 23
FROM   days d
WHERE  NOT EXISTS (             -- Not a holiday
         SELECT 1
         FROM   holidays h
         WHERE  d.dt = h.dt
       )
AND    dt - TRUNC(dt, 'IW') < 5 -- Not a Saturday or Sunday;
ORDER BY dt;

(根据您的需要更改预期工作时间等。)

假设你的桌子:

CREATE TABLE working_day_ranges (Date_from, Date_to) AS
SELECT DATE '2020-01-01', DATE '2020-01-31' FROM DUAL UNION ALL
SELECT DATE '2020-02-01', DATE '2020-02-29' FROM DUAL UNION ALL
SELECT DATE '2020-03-01', DATE '2020-03-31' FROM DUAL;

ALTER TABLE working_day_ranges
  ADD month VARCHAR2(8)
               GENERATED ALWAYS AS (CAST(RTRIM(TO_CHAR(date_from, 'FMMonth')) AS VARCHAR2(8)));

CREATE TABLE holidays (dt, Code, Working_hours) AS
SELECT DATE '2020-01-01', 'Holiday', 0 FROM DUAL UNION ALL
SELECT DATE '2020-03-08', 'Holiday', 0 FROM DUAL UNION ALL
SELECT DATE '2020-09-01', 'Holiday', 0 FROM DUAL UNION ALL
SELECT DATE '2020-12-24', 'Holiday', 0 FROM DUAL;

ALTER TABLE holidays
  ADD week_day VARCHAR2(9)
               GENERATED ALWAYS AS (CAST(RTRIM(TO_CHAR(dt, 'FMDay')) AS VARCHAR2(9)));

然后:

SELECT * FROM working_days;

输出:

DAY WEEK_DAY CODE WORKING_HOURS
02-JAN-20 Thursday Working Day 23
03-JAN-20 Friday Working Day 23
06-JAN-20 Monday Working Day 23
07-JAN-20 Tuesday Working Day 23
08-JAN-20 Wednesday Working Day 23
09-JAN-20 Thursday Working Day 23
10-JAN-20 Friday Working Day 23
13-JAN-20 Monday Working Day 23
14-JAN-20 Tuesday Working Day 23
15-JAN-20 Wednesday Working Day 23
16-JAN-20 Thursday Working Day 23
17-JAN-20 Friday Working Day 23
20-JAN-20 Monday Working Day 23
21-JAN-20 Tuesday Working Day 23
22-JAN-20 Wednesday Working Day 23
23-JAN-20 Thursday Working Day 23
24-JAN-20 Friday Working Day 23
27-JAN-20 Monday Working Day 23
28-JAN-20 Tuesday Working Day 23
29-JAN-20 Wednesday Working Day 23
30-JAN-20 Thursday Working Day 23
31-JAN-20 Friday Working Day 23
03-FEB-20 Monday Working Day 23
04-FEB-20 Tuesday Working Day 23
05-FEB-20 Wednesday Working Day 23
06-FEB-20 Thursday Working Day 23
07-FEB-20 Friday Working Day 23
10-FEB-20 Monday Working Day 23
11-FEB-20 Tuesday Working Day 23
12-FEB-20 Wednesday Working Day 23
13-FEB-20 Thursday Working Day 23
14-FEB-20 Friday Working Day 23
17-FEB-20 Monday Working Day 23
18-FEB-20 Tuesday Working Day 23
19-FEB-20 Wednesday Working Day 23
20-FEB-20 Thursday Working Day 23
21-FEB-20 Friday Working Day 23
24-FEB-20 Monday Working Day 23
25-FEB-20 Tuesday Working Day 23
26-FEB-20 Wednesday Working Day 23
27-FEB-20 Thursday Working Day 23
28-FEB-20 Friday Working Day 23
02-MAR-20 Monday Working Day 23
03-MAR-20 Tuesday Working Day 23
04-MAR-20 Wednesday Working Day 23
05-MAR-20 Thursday Working Day 23
06-MAR-20 Friday Working Day 23
09-MAR-20 Monday Working Day 23
10-MAR-20 Tuesday Working Day 23
11-MAR-20 Wednesday Working Day 23
12-MAR-20 Thursday Working Day 23
13-MAR-20 Friday Working Day 23
16-MAR-20 Monday Working Day 23
17-MAR-20 Tuesday Working Day 23
18-MAR-20 Wednesday Working Day 23
19-MAR-20 Thursday Working Day 23
20-MAR-20 Friday Working Day 23
23-MAR-20 Monday Working Day 23
24-MAR-20 Tuesday Working Day 23
25-MAR-20 Wednesday Working Day 23
26-MAR-20 Thursday Working Day 23
27-MAR-20 Friday Working Day 23
30-MAR-20 Monday Working Day 23
31-MAR-20 Tuesday Working Day 23

db小提琴here

【讨论】:

  • 非常感谢,它正在按预期工作
猜你喜欢
  • 1970-01-01
  • 2016-07-11
  • 2021-10-02
  • 1970-01-01
  • 1970-01-01
  • 2012-08-22
  • 2016-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多