INSERT INTO test VALUES (2, 'cba', SYSDATE);
-- 自動記錄執行當下的日期時間 (精確到秒)
Oracle TO_DATE 僅要求格式字串與輸入字串的「元素對應」正確,分隔符號可任意混用:
-- 以下全部合法且結果相同
TO_DATE('2009/11/01 12:00:00', 'YYYY-MM-DD HH24:MI:SS')
TO_DATE('2009;11;01 12:00:00', 'YYYY-MM-DD HH24:MI:SS')
TO_DATE('2009,11/01 12:00:00', 'YYYY-MM-DD HH24:MI:SS')
TO_DATE('2009-11-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS')
TO_DATE('2009/11-01 12:00:00', 'YYYY;MM-DD HH24:MI:SS')
原理:格式模型定義「年/月/日/時/分/秒」的提取位置,非逐字符匹配分隔符。
需求:查詢 2009-11-01 全天資料 (含 00:00:00 至 23:59:59)
SELECT * FROM dg_order
WHERE date_xd_dr >= TO_DATE('2009-11-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')
AND date_xd_dr < TO_DATE('2009-11-02 00:00:00', 'YYYY-MM-DD HH24:MI:SS');
TRUNC 函數導致索引失效| 寫法 | 問題 |
|---|---|
WHERE TRUNC(date_col) = DATE '2009-11-01' | 函數導致索引失效,全表掃描 |
WHERE date_col BETWEEN '2009-11-01' AND '2009-11-01 23:59:59' | 漏掉 23:59:59.001 等毫秒級資料 |
WHERE date_col LIKE '2009-11-01%' | 隱性轉換、不可用索引、格式依賴 NLS 設定 |
| 元素 | 格式代碼 | 範例輸出 |
|---|---|---|
| 年 (4 位) | YYYY | 2009 |
| 月 (2 位) | MM | 11 |
| 月 (簡稱) | MON | NOV |
| 日 (2 位) | DD | 01 |
| 時 (24制) | HH24 | 13 |
| 時 (12制) | HH / HH12 | 01 |
| 分 | MI | 30 |
| 秒 | SS | 45 |
| 毫秒 | FF3 | 123 |
| 星期幾 | DAY | MONDAY |
| 年中的天 | DDD | 305 |
-- 日期加減天數
SYSDATE + 7 -- 7 天后
SYSDATE - 30 -- 30 天前
-- 日期加減月份 (ADD_MONTHS 處理月末邊界)
ADD_MONTHS(SYSDATE, 3) -- 3 個月後
ADD_MONTHS(SYSDATE, -1) -- 1 個月前
-- 兩日期間隔天數 (含小數)
SYSDATE - TO_DATE('2009-01-01','YYYY-MM-DD')
-- 截斷到單位 (TRUNC)
TRUNC(SYSDATE, 'MM') -- 本月 1 號 00:00:00
TRUNC(SYSDATE, 'YYYY') -- 今年 1 月 1 號 00:00:00
-- 遞增到下一個單位 (ROUND)
ROUND(SYSDATE, 'MM') -- 下月 1 號 00:00:00 (若超過月中)
-- 最後一天
LAST_DAY(SYSDATE) -- 本月最後一天 00:00:00
-- 下一個指定星期
NEXT_DAY(SYSDATE, 'FRIDAY')
NLS_DATE_FORMAT 影響隱性轉換與顯示,生產代碼禁止依賴隱性轉換TO_DATE('string', 'format') 顯式轉換ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';'2009-11-01T00:00:00' (Oracle 11g+ 支援 TO_TIMESTAMP_TZ)DATE:精確到秒,無時區資訊TIMESTAMP:精確到毫秒/微秒,無時區TIMESTAMP WITH TIME ZONE:含時區位移TIMESTAMP WITH LOCAL TIME ZONE:資料庫時區正規化儲存,查詢時轉換為 Session 時區TIMESTAMP WITH LOCAL TIME ZONEOracle 日期操作的核心原則:顯式轉換、半開區間篩選、避免欄位加函數、善用 ADD_MONTHS/LAST_DAY 處理邊界。掌握這套模式,日期查詢既精確又高效。