Oracle 提供 TO_TIMESTAMP、TO_TIMESTAMP_TZ、TO_DATE 將字串轉為時間型態,並以 TO_CHAR 反向輸出。本文整理轉換語法、時區處理、TIMESTAMP 運算特性、精度轉換陷阱與實戰範例。
| 函式 | 用途 | 語法 | 適用場景 |
|---|---|---|---|
| TO_DATE | 字串 → DATE(秒精度) | TO_DATE(str, fmt) | 一般業務日期,不需時區/小數秒 |
| TO_TIMESTAMP | 字串 → TIMESTAMP(奈秒精度) | TO_TIMESTAMP(str, fmt) | 高精度時間戳記,無時區資訊 |
| TO_TIMESTAMP_TZ | 字串 → TIMESTAMP WITH TIME ZONE | TO_TIMESTAMP_TZ(str, fmt) | 跨時區系統,保留時差資訊 |
| TO_CHAR | 日期/時間 → 字串 | TO_CHAR(dt, fmt) | 報表輸出、介面顯示 |
-- DATE / TIMESTAMP 共用
YYYY-MM-DD HH24:MI:SS
-- TIMESTAMP 專屬:小數秒
FF / FF1 .. FF9 -- 1~9 位小數秒,對應 TIMESTAMP(1~9)
-- TIMESTAMP WITH TIME ZONE 專屬:時區
TZH:TZM -- 時區時:分 (如 +08:00)
TZR -- 時區名稱 (如 Asia/Taipei)
-- 字串轉 TIMESTAMP(6) 並更新
UPDATE t_fl_flownote
SET sendtime = TO_TIMESTAMP('2009-11-30 10:47:16', 'YYYY-MM-DD HH24:MI:SS');
-- 帶時區字串轉換
SELECT TO_TIMESTAMP_TZ('2009-03-09 17:51:23.23 +08:00', 'YYYY-MM-DD HH24:MI:SS.FF TZH:TZM')
FROM dual;
兩個 TIMESTAMP 相減回傳 INTERVAL DAY TO SECOND 型態,直接顯示「天 時:分:秒.小數秒」:
CREATE TABLE test (t1 TIMESTAMP(6), t2 TIMESTAMP(6));
INSERT INTO test VALUES (
TO_TIMESTAMP('2006-01-01 12:10:10.1', 'YYYY-MM-DD HH24:MI:SS.FF'),
TO_TIMESTAMP('2006-01-01 12:20:10.2', 'YYYY-MM-DD HH24:MI:SS.FF')
);
SELECT t2 - t1 FROM test;
-- 結果:+000000000 00:10:00.100000 (0天 0時10分0.1秒)
-- 錯誤嘗試:直接乘 1440 (24*60)
SELECT 1440 * (t2 - t1) FROM test;
-- 結果:+000000010 00:02:24.000000 (錯誤!每個欄位獨立乘 1440 後再進位)
-- 正確做法:先轉為單一單位
SELECT EXTRACT(DAY FROM diff) * 1440 +
EXTRACT(HOUR FROM diff) * 60 +
EXTRACT(MINUTE FROM diff) +
EXTRACT(SECOND FROM diff) / 60 AS total_minutes
FROM (SELECT t2 - t1 AS diff FROM test);
date1 - date2 直接得天數)、儲存 7 Bytes。TO_TIMESTAMP 格式模型中 FF 位數必須與目標欄位精度一致(如 TIMESTAMP(3) 用 FF3),否則四捨五入或截斷。NLS_TIMESTAMP_FORMAT、NLS_TIMESTAMP_TZ_FORMAT 會影響隱含轉換,建議永遠顯式指定格式。INTERVAL 型態無法直接乘數值,需用 EXTRACT 拆解後運算。精準掌握字串↔時間型態轉換與運算規則,是處理審計日誌、金融交易、物聯網感測器資料的基本功。