您可以使用以下方法创建表:
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