Oracle 日期運算是開發與管理常見需求。本文彙整 16 個實用範例,涵蓋週期計算、格式轉換、邊界取值、閏年判斷、季度計算等,供快速查閱與套用。
SELECT TO_CHAR(SYSDATE, 'YYYYMMDD W HH24:MI:SS') FROM DUAL;
-- 結果範例: 20030327 4 18:16:09
SELECT TO_CHAR(SYSDATE, 'W') FROM DUAL; -- 單獨取週數
SELECT SYSDATE, TO_CHAR(SYSDATE, 'D') FROM DUAL;
常用格式模板對照:
| 格式 | 含義 |
|---|---|
| YYYY | 年 |
| Q | 季 |
| MM | 月 |
| DD | 日 |
| DDD | 年中第幾天 |
| WW | 年第幾週 |
| W | 月第幾週 |
| D | 週中第幾天 |
| HH / HH24 | 12/24 小時制 |
| MI | 分 |
| SS | 秒 |
SELECT TO_CHAR(SYSDATE, 'DAY') FROM DUAL; -- 例: 星期四
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
設定 Session 層級日期格式,避免隱含轉換導致索引失效。
-- 當前日期時間
SELECT SYSDATE FROM DUAL;
-- 今日 00:00:00
SELECT TRUNC(SYSDATE) FROM DUAL;
-- 今日最後一秒 (近似)
SELECT TRUNC(SYSDATE) + 0.99999 FROM DUAL;
-- 加 N 小時
SELECT TRUNC(SYSDATE) + 1/24 FROM DUAL; -- 1小時後
SELECT TRUNC(SYSDATE) + 7/24 FROM DUAL; -- 7小時後
-- 明日 00:00:00
SELECT TRUNC(SYSDATE + 1) FROM DUAL;
SELECT TRUNC(SYSDATE) + 1 FROM DUAL;
-- 本月 1 號 00:00:00
SELECT TRUNC(SYSDATE, 'MM') FROM DUAL;
-- 下月 1 號
SELECT TRUNC(ADD_MONTHS(SYSDATE, 1), 'MM') FROM DUAL;
-- 本月最後一天 (多種寫法)
SELECT LAST_DAY(SYSDATE) FROM DUAL;
SELECT LAST_DAY(TRUNC(SYSDATE)) FROM DUAL;
SELECT TRUNC(LAST_DAY(SYSDATE)) FROM DUAL;
SELECT TRUNC(ADD_MONTHS(SYSDATE, 1), 'MM') - 1 FROM DUAL;
SELECT TRUNC(SYSDATE, 'YYYY') + ROWNUM - 1 AS DATE0
FROM (SELECT ROWNUM RN FROM ALL_OBJECTS WHERE ROWNUM < 366);
SELECT TO_CHAR(SYSDATE, 'DDD') FROM DUAL;
SELECT ADD_MONTHS(SYSDATE, 24) FROM DUAL; -- 加 2 年
-- 今年
SELECT DECODE(TO_CHAR(LAST_DAY(TRUNC(SYSDATE, 'Y') + 31), 'DD'), '29', '閏年', '平年') FROM DUAL;
-- 兩年後
SELECT DECODE(TO_CHAR(LAST_DAY(TRUNC(ADD_MONTHS(SYSDATE, 24), 'Y') + 31), 'DD'), '29', '閏年', '平年') FROM DUAL;
原理:取該年 1 月 31 日,加 31 天到 3 月 2 日,再取該月最後一天,若為 29 號則為閏年。
SELECT CEIL(TO_NUMBER(TO_CHAR(SYSDATE, 'MM')) / 3) FROM DUAL;
SELECT TO_CHAR(SYSDATE, 'Q') FROM DUAL; -- 內建格式更簡潔