首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 查詢本月所有星期五日期的高效 SQL

     編輯:Oracle 資料庫相關知識

利用 Oracle 連接查詢與日期函數,單條 SQL 即可產生本月所有星期五的日期清單,適合排程、報表產生等場景。

核心 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 時)

邏輯解析

  1. TRUNC(SYSDATE, 'MM'):取得本月 1 日 00:00:00
  2. LAST_DAY(SYSDATE):取得本月最後一日
  3. CONNECT BY LEVEL <= ...:產生本月天數的序列(1~28/29/30/31)
  4. TRUNC(SYSDATE, 'MM') + ROWNUM - 1:展開成本月每一天的 DATE 值
  5. 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;

效能提示

  • 僅掃描 DUAL 表,零 I/O,極快
  • 若頻繁呼叫,可封裝為 PIPELINED FUNCTION 供 TABLE(...) 呼叫

作者:scorpio3k

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved