DATE:精確到秒,含年月日時分秒,無時區資訊。TIMESTAMP:精確到小數秒(最多 9 位),可選帶時區(WITH TIME ZONE/WITH LOCAL TIME ZONE)。00:00:00 為午夜(AM 12:00),12:00:00 為中午(PM 12:00)。| 函數 | 用途 | 範例 | 結果說明 |
|---|---|---|---|
ADD_MONTHS(d, n) | 日期加減月份 | ADD_MONTHS(TO_DATE('2007-02-27','YYYY-MM-DD'),1) | 2007-03-27 00:00:00(無時間部分保留 00:00) |
ADD_MONTHS(TO_DATE('2007-02-27 12:01','YYYY-MM-DD HH24:MI'),1) | 2007-03-27 12:01:00(有時間部分保留時間) | ||
ADD_MONTHS(TO_DATE('2007-02-28','YYYY-MM-DD'),1) | 2007-03-31 00:00:00(月末自動調整) | ||
LAST_DAY(d) | 當月最後一天 00:00:00 | LAST_DAY(SYSDATE) | 本月最後一天零點 |
ROUND(d, [fmt]) | 四捨五入 | ROUND(TO_DATE('2007-10-19 13:00','YYYY-MM-DD HH24:MI'),'DAY') | 2007-10-21 00:00:00(最近的週日) |
TRUNC(d, [fmt]) | 捨去(不四捨五入) | TRUNC(SYSDATE,'MONTH') | 本月 1 號 00:00:00 |
EXTRACT(fmt FROM d) | 擷取欄位 | EXTRACT(MONTH FROM SYSDATE) | 數值型月份 (1-12) |
-- 減去 7 分鐘/小時/天/月/年
SELECT SYSDATE - INTERVAL '7' MINUTE FROM DUAL;
SELECT SYSDATE - INTERVAL '7' HOUR FROM DUAL;
SELECT SYSDATE - INTERVAL '7' DAY FROM DUAL;
SELECT SYSDATE - INTERVAL '7' MONTH FROM DUAL;
SELECT SYSDATE - INTERVAL '7' YEAR FROM DUAL;
-- 間隔乘數
SELECT SYSDATE - 8 * INTERVAL '2' HOUR FROM DUAL; -- 減 16 小時
優點:語意清晰、自動處理月份長度差異、支援 DAY TO SECOND/YEAR TO MONTH 兩種間隔型別。
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM DUAL; -- 2024-01-15 14:30:05
SELECT TO_CHAR(SYSDATE, 'YYYY-"Q"Q') FROM DUAL; -- 2024-Q1
SELECT TO_CHAR(SYSDATE, 'IW') FROM DUAL; -- ISO 週數
SELECT TO_DATE('2024-01-15 14:30:05', 'YYYY-MM-DD HH24:MI:SS') FROM DUAL;
格式元素同 TO_CHAR,常用:YYYY MM DD HH24 MI SS FF3(毫秒)。
| 需求 | SQL 範例 |
|---|---|
| 本月第一天 00:00 | TRUNC(SYSDATE, 'MONTH') |
| 本月最後一天 23:59:59 | LAST_DAY(SYSDATE) + INTERVAL '1' DAY - INTERVAL '1' SECOND |
| 上週一 00:00 | TRUNC(SYSDATE - 7, 'IW')(ISO 週一為週首) |
| 兩日期相差天數 | TRUNC(end_dt) - TRUNC(start_dt) |
| 判斷是否閏年 | CASE WHEN TO_CHAR(LAST_DAY(TO_DATE('02-'||yr,'MM-YYYY')), 'DD') = '29' THEN 1 ELSE 0 END |
| 時間帶時區轉換 | CAST(ts_col AT TIME ZONE 'UTC' AS TIMESTAMP WITH LOCAL TIME ZONE) |
WHERE TRUNC(dt_col) = TRUNC(SYSDATE) 導致全表掃描,改用 WHERE dt_col >= TRUNC(SYSDATE) AND dt_col < TRUNC(SYSDATE)+1。NLS_DATE_FORMAT 影響隱式轉換,PL/SQL 明確使用 TO_DATE/TO_CHAR 指定格式。SYSDATE 回傳 DB 伺服器時間,分布式環境統一用 SYSTIMESTAMP + 時區轉換。