日期時間處理是業務開發高頻需求。Oracle 提供豐富的 TO_CHAR 格式模型與日期運算函數。本文彙整 16 種實用場景,附 SQL 可直接複製套用。
| # | 需求 | SQL 範例 | 關鍵格式/函數 |
|---|---|---|---|
| 1 | 本月第幾週 | SELECT TO_CHAR(SYSDATE, 'W') FROM DUAL; | W (月內週數 1~5) |
| 2 | 本週第幾天 (週日=1) | SELECT TO_CHAR(SYSDATE, 'D') FROM DUAL; | D (週內天數 1~7) |
| 3 | 中文星期名稱 | SELECT TO_CHAR(SYSDATE, 'DAY', 'NLS_DATE_LANGUAGE=TRADITIONAL CHINESE') FROM DUAL; | DAY + NLS 參數 |
| 4 | 索引欄位日期查詢避免隱性轉換 | ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'; | Session 級格式化 |
| 5 | 當前日期時間 | SELECT SYSDATE FROM DUAL; | SYSDATE |
| 6 | 今天 00:00:00 / 23:59:59 | SELECT TRUNC(SYSDATE), TRUNC(SYSDATE) + 0.99999 FROM DUAL; | TRUNC + 小數天數 |
| 7 | 明天 00:00:00 | SELECT TRUNC(SYSDATE + 1) FROM DUAL; | TRUNC(SYSDATE+1) |
| 8 | 本月 1 號 | SELECT TRUNC(SYSDATE, 'MM') FROM DUAL; | TRUNC(date, 'MM') |
| 9 | 下月 1 號 | SELECT TRUNC(ADD_MONTHS(SYSDATE, 1), 'MM') FROM DUAL; | ADD_MONTHS + TRUNC |
| 10 | 本月最後一天 | SELECT LAST_DAY(SYSDATE) FROM DUAL; | LAST_DAY |
| 11 | 本年每一天列表 | SELECT TRUNC(SYSDATE,'YYYY') + ROWNUM - 1 FROM DUAL CONNECT BY LEVEL <= 366; | CONNECT BY 生成序列 |
| 12 | 今天是今年第幾天 | SELECT TO_CHAR(SYSDATE, 'DDD') FROM DUAL; | DDD (年積日) |
| 13 | 日期加 2 年 | SELECT ADD_MONTHS(SYSDATE, 24) FROM DUAL; | ADD_MONTHS (月為單位) |
| 14 | 判斷今年是否閏年 | SELECT DECODE(TO_CHAR(LAST_DAY(TRUNC(SYSDATE,'Y')+31), 'DD'), '29', '閏年', '平年') FROM DUAL; | 2/29 存在判斷 |
| 15 | 判斷兩年後是否閏年 | SELECT DECODE(TO_CHAR(LAST_DAY(TRUNC(ADD_MONTHS(SYSDATE,24),'Y')+31), 'DD'), '29', '閏年', '平年') FROM DUAL; | 同上邏輯 |
| 16 | 取得季度 (1~4) | SELECT TO_CHAR(SYSDATE, 'Q') FROM DUAL; | Q (季度) |
YYYY / YY 年 (4/2 位)
MM 月 (01~12)
DD 日 (01~31)
HH24 / HH 時 (24/12 制)
MI 分
SS 秒
DAY / DY 星期名稱 / 縮寫
D 週內天數 (1=週日)
W 月內週數
WW 年內週數
DDD 年內天數
Q 季度