在資料庫效能診斷中,時間是核心指標。早期 Oracle 僅支援厘秒(百分之一秒)精度,導致兩大盲區:
傳統 DATE 僅能存單一時間點,表達「間隔」只能轉成秒存入 NUMBER,導致換算(60秒=1分、24小時=1天)在十進位制下極不直觀,計算易出錯。
Oracle 引入 SQL:1999 標準的時間間隔類型,徹底解決精度與運算難題:
| 類型 | 用途 | 精度 |
|---|---|---|
INTERVAL YEAR TO MONTH | 年月間隔 | 年精度預設 2 位 |
INTERVAL DAY TO SECOND | 天至秒(含小數秒)間隔 | 天預設 2 位,秒小數預設 6 位 |
TIMESTAMP | 無時區時間點 | 小數秒可配置 |
TIMESTAMP WITH TIME ZONE | 帶時區時間點 | 解決地理位置時間差 |
TIMESTAMP WITH LOCAL TIME ZONE | 自動轉換為資料庫/會話時區 | 同上 |
-- 年月間隔:以連字號分隔
INTERVAL '2-6' YEAR TO MONTH -- 2 年 6 月
-- 天秒間隔:以空格分隔天與時間
INTERVAL '10 12:30:45.123' DAY TO SECOND -- 10 天 12 時 30 分 45.123 秒
-- 取得含 5 位小數秒的完整時間戳
SELECT TO_CHAR(CURRENT_TIMESTAMP(5), 'DD-MON-YYYY HH24:MI:SS.FF') FROM DUAL;
-- 僅取分秒含 9 位小數(最大精度)
SELECT TO_CHAR(CURRENT_TIMESTAMP(9), 'MI:SS.FF') FROM DUAL;
TO_DATE('2008-11-27 13:34:43', 'YYYY-MM-DD HH24:MI:SS') → 字串轉日期TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') → 日期轉格式化字串V$SQL.ELAPSED_TIME - CPU_TIME = 等待時間,但難見真實等待細節。V$SYSTEM_EVENT 僅提供實例級累積等待,無法鑽取單條 SQL 或 OS 層等待。DBMS_MONITOR、ASHRPT 或 SQL Trace 獲取微秒級追蹤。棄用 DATE+NUMBER 的笨拙組合,全面擁抱 TIMESTAMP 與 INTERVAL 類型,不僅獲得微秒精度,更能利用原生間隔運算簡化邏輯,讓效能分析、排程計算、跨時區應用都建立在精準可靠的時間基石之上。