EXTRACT 函數用於從日期時間值中擷取特定元件(年、月、日、時、分、秒等),但其引數類型有嚴格限制,常見錯誤源於對 DATE 與 TIMESTAMP 差異的誤解。
SELECT EXTRACT(YEAR FROM SYSDATE) FROM DUAL; -- 可行,回傳年份
SELECT EXTRACT(MONTH FROM SYSDATE) FROM DUAL; -- 可行,回傳月份
SELECT EXTRACT(DAY FROM SYSDATE) FROM DUAL; -- 可行,回傳日期
SELECT EXTRACT(HOUR FROM SYSDATE) FROM DUAL; -- 報錯!SYSDATE 是 DATE 型別
SELECT EXTRACT(HOUR FROM TIMESTAMP '2005-10-10 10:10:10') FROM DUAL; -- 正確
SELECT EXTRACT(MINUTE FROM SYSDATE) FROM DUAL; -- 報錯
SELECT EXTRACT(MINUTE FROM TIMESTAMP '2005-10-10 10:10:10') FROM DUAL; -- 正確
SYSDATE、資料表的 DATE 欄位)僅支援擷取 YEAR、MONTH、DAY。TIMESTAMP WITH TIME ZONE)才支援擷取 HOUR、MINUTE、SECOND、TIMEZONE_HOUR 等時間元件。TO_CHAR/TO_DATE 轉字串後再包在 TIMESTAMP '...' 中,仍會報錯。若需從 DATE 型別欄位取得時分秒,請直接使用 TO_CHAR:
SELECT TO_CHAR(date_col, 'HH24:MI:SS') FROM table_name;
SELECT TO_CHAR(date_col, 'HH24') || ':' || TO_CHAR(date_col, 'MI') FROM table_name;
總結:EXTRACT 嚴格區分資料型別,DATE 只能取年月日,TIMESTAMP 才能取時分秒;切勿嘗試用字串轉換繞過型別檢查。