TO_CHAR:數值/日期 → 字串
日期格式化
TO_CHAR(date, fmt)
| 常用格式 | 輸出範例 |
YYYY-MM-DD HH24:MI:SS | 2024-01-15 14:30:59 |
YYYY"年"MM"月"DD"日" | 2024年01月15日 |
HH24:MI:SS | 14:30:59 |
YYYY-DDD | 2024-015(年間第幾天) |
YYYY-MM IW-D | 2024-01 03-1(ISO 週/週幾) |
數值格式化
TO_CHAR(number, fmt)
| 格式 | 輸入 | 輸出 | 說明 |
99,999.9999 | 5764.12345 | 5,764.1235 | 9=數字位,前導空白 |
09,999.9999 | 5764.12345 | 05,764.1235 | 0=前導零 |
FM9999999.0099 | 123.0233 | 123.0233 | FM去空白,00至少2位,99最多4位 |
TO_DATE:字串 → 日期
TO_DATE(string, fmt)
| 輸入字串 | fmt | 結果 |
'2024-01-15 14:30:59' | 'YYYY-MM-DD HH24:MI:SS' | 2024-01-15 14:30:59 |
'2024-01-15' | 'YYYY-MM-DD' | 2024-01-15 00:00:00 |
插入範例
INSERT INTO item_test (item_id, item_desc, created_dt)
VALUES ('ITEM-001', 'Sample',
TO_DATE('2024-01-25', 'YYYY-MM-DD'));
常見錯誤與避坑
- HH vs HH24:
HH 為 12 小時制(1-12),HH24 為 24 小時制(0-23)。
- MI vs MM:
MI = 分鐘,MM = 月份。
TO_DATE('14:30', 'HH24:MM') 會報錯或產生錯誤結果(月份重複)。
- NLS 相依性:若格式模板與 Session
NLS_DATE_FORMAT、NLS_LANGUAGE 不符,可能報錯。建議在 SQL 中明確指定 fmt。
- 隱含轉換:
WHERE dt = '2024-01-15' 依賴隱含 TO_DATE,效能差且易出錯 → 改用 DATE '2024-01-15' 或 TO_DATE(..., fmt)。
進階:時間間隔運算(10g+)
-- 當前時間減 7 分鐘
SELECT SYSDATE - INTERVAL '7' MINUTE FROM dual;
-- 當前時間減 7 小時
SELECT SYSDATE - INTERVAL '7' HOUR FROM dual;
-- 當前時間減 7 天
SELECT SYSDATE - INTERVAL '7' DAY FROM dual;
-- 間隔乘以純量
SELECT SYSDATE - 8 * INTERVAL '2' HOUR FROM dual;
毫秒級支援
-- 含毫秒的目前時間
SELECT TO_CHAR(CURRENT_TIMESTAMP(5), 'DD-MON-YYYY HH24:MI:SS.FF') FROM dual;
-- 只取分秒毫秒
SELECT TO_CHAR(CURRENT_TIMESTAMP(9), 'MI:SS.FF') FROM dual;
程式執行耗時測量(毫秒)
DECLARE
l_start NUMBER := DBMS_UTILITY.GET_TIME; -- 百分之一秒
l_dummy all_objects.object_name%TYPE;
l_rc SYS_REFCURSOR;
BEGIN
FOR i IN 1..1000 LOOP
OPEN l_rc FOR 'SELECT object_name FROM all_objects WHERE object_id = ' || i;
FETCH l_rc INTO l_dummy;
CLOSE l_rc;
END LOOP;
DBMS_OUTPUT.PUT_LINE(ROUND((DBMS_UTILITY.GET_TIME - l_start)/100, 2) || ' seconds');
END;
/