![](/img/trans.png)
[英]Oracle SQL - get number of days between two dates for a specified month
[英]Oracle SQL query workout days between two dates
我需要有關 SQL 查詢的幫助,該查詢將生成 Start_date 和 End_Date 之間的星期幾並使用工作日。
示例:日歷 99 的開始日期和結束日期之間需要是工作日“星期三”起點 (seqnum 1) 和工作日星期六 (seqnum2) 的日期。
簡而言之,兩個日期之間的星期日期取決於日歷和工作日以及要生產的順序的 seqnum。
任何幫助或想法將不勝感激。
CREATE TABLE CALENDAR
(
CALENDAR_NAME VARCHAR2(500 CHAR),
START_DATE VARCHAR2(100 CHAR),
END_DATE VARCHAR2(100 CHAR),
SEQNUM NUMBER,
WEEKDAY VARCHAR2(9 CHAR),
STARTTIME VARCHAR2(8 CHAR)
);
Insert into SCPOMGR.UDT_CALENDAR
(CALENDAR_NAME, START_DATE, END_DATE, SEQNUM, WEEKDAY,
STARTTIME)
Values
('99', '2020-07-29', '2021-08-07', 1, 'WEDNESDAY',
'17:00:00');
Insert into SCPOMGR.UDT_CALENDAR
(CALENDAR_NAME, START_DATE, END_DATE, SEQNUM, WEEKDAY,
STARTTIME)
Values
('99', '2020-07-29', '2021-08-07', 2, 'SATURDAY',
'17:00:00');
Insert into SCPOMGR.UDT_CALENDAR
(CALENDAR_NAME, START_DATE, END_DATE, SEQNUM, WEEKDAY,
STARTTIME)
Values
('179', '2000-01-02', '2021-02-01', 1, 'MONDAY',
'18:00:00');
Insert into SCPOMGR.UDT_CALENDAR
(CALENDAR_NAME, START_DATE, END_DATE, SEQNUM, WEEKDAY,
STARTTIME)
Values
('179', '2000-01-02', '2021-02-01', 2, 'WEDNESDAY',
'18:00:00');
Insert into SCPOMGR.UDT_CALENDAR
(CALENDAR_NAME, START_DATE, END_DATE, SEQNUM, WEEKDAY,
STARTTIME)
Values
('179', '2000-01-02', '2021-02-01', 3, 'FRIDAY',
'18:00:00');
Insert into SCPOMGR.UDT_CALENDAR
(CALENDAR_NAME, START_DATE, END_DATE, SEQNUM, WEEKDAY,
STARTTIME)
Values
('179', '2000-01-02', '2021-02-01', 4, 'SUNDAY',
'18:00:00');
Insert into SCPOMGR.UDT_CALENDAR
(CALENDAR_NAME, START_DATE, END_DATE, SEQNUM, WEEKDAY,
STARTTIME)
Values
('772', '2000-01-02', '2021-02-01', 1, 'TUESDAY',
'18:00:00');
Insert into SCPOMGR.UDT_CALENDAR
(CALENDAR_NAME, START_DATE, END_DATE, SEQNUM, WEEKDAY,
STARTTIME)
Values
('772', '2000-01-02', '2021-02-01', 2, 'WEDNESDAY',
'18:00:00');
Insert into SCPOMGR.UDT_CALENDAR
(CALENDAR_NAME, START_DATE, END_DATE, SEQNUM, WEEKDAY,
STARTTIME)
Values
('772', '2000-01-02', '2021-02-01', 3, 'THURSDAY',
'18:00:00');
Insert into SCPOMGR.UDT_CALENDAR
(CALENDAR_NAME, START_DATE, END_DATE, SEQNUM, WEEKDAY,
STARTTIME)
Values
('772', '2000-01-02', '2021-02-01', 4, 'FRIDAY',
'18:00:00');
Insert into SCPOMGR.UDT_CALENDAR
(CALENDAR_NAME, START_DATE, END_DATE, SEQNUM, WEEKDAY,
STARTTIME)
Values
('772', '2000-01-02', '2021-02-01', 5, 'SATURDAY',
'18:00:00');
Insert into SCPOMGR.UDT_CALENDAR
(CALENDAR_NAME, START_DATE, END_DATE, SEQNUM, WEEKDAY,
STARTTIME)
Values
('772', '2000-01-02', '2021-02-01', 6, 'SUNDAY',
'18:00:00');
Insert into SCPOMGR.UDT_CALENDAR
(CALENDAR_NAME, START_DATE, END_DATE, SEQNUM, WEEKDAY,
STARTTIME)
Values
('772', '2000-01-02', '2021-02-01', 7, 'MONDAY',
'18:00:00');
COMMIT;
簡而言之,兩個日期之間的星期日期取決於日歷和工作日以及要生產的順序的 seqnum。
如果這被解釋為,對於每個calendar_name
,您希望從start_date
開始並輸出與每周的weekday
匹配的星期幾,直到您到達end_date
。
注意:如果將日期存儲在日期數據類型中會更好。
您可以使用遞歸子查詢:
WITH dates (calendar_name, dt, end_date) AS (
SELECT calendar_name,
NEXT_DAY(TO_DATE(start_date, 'YYYY-MM-DD') - INTERVAL '1' DAY, weekday),
TO_DATE(end_date, 'YYYY-MM-DD')
FROM calendar
WHERE NEXT_DAY(TO_DATE(start_date, 'YYYY-MM-DD') - INTERVAL '1' DAY, weekday)
<= TO_DATE(end_date, 'YYYY-MM-DD')
UNION ALL
SELECT calendar_name,
dt + INTERVAL '7' DAY,
end_date
FROM dates
WHERE dt + INTERVAL '7' DAY <= end_date
)
SELECT calendar_name,
dt
FROM dates
ORDER BY
calendar_name,
dt
db<> 在這里擺弄
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.