日期時間處理是 SQL 開發高頻需求。本文系統整理 SYSDATE 取得系統時間、TO_CHAR 格式化輸出、TO_DATE 字串轉日期、TO_NUMBER 字串轉數字的完整語法、格式元素對照表、常見陷阱與實戰範例。
| 函數 | 用途 | 語法 | 範例 |
|---|---|---|---|
| SYSDATE | 取得資料庫系統日期時間 | SYSDATE | SELECT SYSDATE FROM DUAL; |
| TO_CHAR | 日期/數字 → 字串 | TO_CHAR(date/number, 'format') | TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') |
| TO_DATE | 字串 → 日期 | TO_DATE(char, 'format') | TO_DATE('2024-01-15 14:30:00', 'YYYY-MM-DD HH24:MI:SS') |
| TO_NUMBER | 字串 → 數字 | TO_NUMBER(char, 'format') | TO_NUMBER('1,234.56', '9G999D99') |
| 類別 | 元素 | 說明 | 範例輸出 |
|---|---|---|---|
| 年 | YYYY | 4 位西元年 | 2024 |
| YYY | 後 3 位 | 024 | |
| YY | 後 2 位 | 24 | |
| Y | 最後 1 位 | 4 | |
| 月 | MM | 2 位數字月 | 01 |
| MON | 縮寫月名 | JAN | |
| MONTH | 全名 | JANUARY | |
| 日 | DD | 月內第幾天 | 15 |
| DDD | 年內第幾天 | 015 | |
| DY | 星期縮寫 | MON | |
| DAY | 星期全名 | MONDAY | |
| 時 | HH24 | 24 小時制 | 14 |
| HH12 / HH | 12 小時制 | 02 | |
| 分 | MI | 分鐘 (非 MM!) | 30 |
| 秒 | SS | 秒 | 00 |
| 季 | Q | 季度 1-4 | 1 |
| 週 | WW / W | 年內週數 / 月內週數 | 03 / 2 |
-- 完整時間 (24小時制)
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM DUAL; -- 2024-01-15 14:30:00
-- 短日期
SELECT TO_CHAR(SYSDATE, 'YY-MM-DD') FROM DUAL; -- 24-01-15
-- 帶中文/自定義文字
SELECT TO_CHAR(SYSDATE, 'YYYY"年"MM"月"DD"日"') FROM DUAL; -- 2024年01月15日
-- 正確:24小時制配合 HH24
SELECT TO_DATE('2024-01-15 14:30:00', 'YYYY-MM-DD HH24:MI:SS') FROM DUAL;
-- 錯誤:14 超過 12小時制範圍
SELECT TO_DATE('2024-01-15 14:30:00', 'YYYY-MM-DD HH12:MI:SS') FROM DUAL; -- ORA-01821
-- 貨幣格式
SELECT TO_CHAR(1000000, '$99,999,999.99') FROM DUAL; -- $1,000,000.00
SELECT TO_CHAR(1000000, 'L99,999,999.99') FROM DUAL; -- 本地貨幣符號 (如 NT$)
-- 截斷小數
SELECT TRUNC(TO_NUMBER('1000000.123'), 2) FROM DUAL; -- 1000000.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 '7' HOUR FROM DUAL;
MI,月份用 MM,寫錯會導致格式錯位HH24,HH12 只接受 1-12TO_DATE 無格式遮罩時依賴 NLS_DATE_FORMAT,跨環境請永遠指定格式SYSDATE 回傳資料庫伺服器時區,跨時區應用建議用 SYSTIMESTAMP + TIMEZONE 處理熟練日期格式元素與轉換函數,能消除 90% 的日期處理 Bug。