利用 Oracle 連接查詢與日期函數,單條 SQL 即可產生本月所有星期五的日期清單,適合排程、報表產生等場景。
SELECT *
FROM (
SELECT TRUNC(SYSDATE, 'MM') + ROWNUM - 1 AS DAYS
FROM (
SELECT LEVEL
FROM DUAL
CONNECT BY LEVEL <= TRUNC(LAST_DAY(SYSDATE)) - TRUNC(SYSDATE, 'MM') + 1
)
)
WHERE TO_CHAR(DAYS, 'D') = '6'; -- 6 代表星期五(NLS_TERRITORY=AMERICA 時)
TRUNC(SYSDATE, 'MM'):取得本月 1 日 00:00:00LAST_DAY(SYSDATE):取得本月最後一日CONNECT BY LEVEL <= ...:產生本月天數的序列(1~28/29/30/31)TRUNC(SYSDATE, 'MM') + ROWNUM - 1:展開成本月每一天的 DATE 值TO_CHAR(..., 'D') = '6':過濾星期五(注意:'D' 受 NLS_TERRITORY 影響,台灣/香港通常 6=五,美國 6=五,歐洲部分 5=五,建議改用 TO_CHAR(DAYS, 'FMDAY', 'NLS_DATE_LANGUAGE=ENGLISH') = 'FRIDAY' 避免歧義)-- 查詢 2024 年 2 月所有星期五
SELECT TO_CHAR(DT, 'YYYY-MM-DD') AS FRIDAY_DATE
FROM (
SELECT TRUNC(TO_DATE('2024-02', 'YYYY-MM'), 'MM') + LEVEL - 1 AS DT
FROM DUAL
CONNECT BY LEVEL <= LAST_DAY(TO_DATE('2024-02', 'YYYY-MM')) - TRUNC(TO_DATE('2024-02', 'YYYY-MM'), 'MM') + 1
)
WHERE TO_CHAR(DT, 'FMDAY', 'NLS_DATE_LANGUAGE=ENGLISH') = 'FRIDAY'
ORDER BY DT;
PIPELINED FUNCTION 供 TABLE(...) 呼叫作者:scorpio3k