DB2 提供豐富的內建日期時間函數,支援抽取元件、日期運算、格式化輸出、時區調整與差異計算。本文整理完整函數清單、常用語法範例、時區處理技巧、自訂精確秒差函數與閏年判斷函數。
| 函數 | 回傳值 | 範例 |
|---|---|---|
YEAR(dt) | 年份 (INTEGER) | YEAR(CURRENT TIMESTAMP) → 2024 |
MONTH(dt) | 月份 1-12 | MONTH(CURRENT DATE) → 10 |
DAY(dt) | 日期 1-31 | DAY(CURRENT DATE) → 15 |
HOUR(dt) | 小時 0-23 | HOUR(CURRENT TIME) → 14 |
MINUTE(dt) | 分鐘 0-59 | MINUTE(CURRENT TIME) → 30 |
SECOND(dt) | 秒 0-59 | SECOND(CURRENT TIME) → 45 |
MICROSECOND(ts) | 微秒 0-999999 | MICROSECOND(CURRENT TIMESTAMP) → 123456 |
DAYNAME(dt) | 星期名稱 (英文混合大小寫) | DAYNAME(CURRENT DATE) → 'Friday' |
MONTHNAME(dt) | 月份名稱 | MONTHNAME(CURRENT DATE) → 'October' |
DAYOFWEEK(dt) | 1=週日 ... 7=週六 | DAYOFWEEK(CURRENT DATE) → 6 |
DAYOFWEEK_ISO(dt) | 1=週一 ... 7=週日 (ISO 8601) | DAYOFWEEK_ISO(CURRENT DATE) → 5 |
DAYOFYEAR(dt) | 年間第幾天 1-366 | DAYOFYEAR(CURRENT DATE) → 289 |
WEEK(dt) | 年間第幾週 1-54 (週日為首) | WEEK(CURRENT DATE) → 42 |
WEEK_ISO(dt) | 年間第幾週 1-53 (ISO 8601) | WEEK_ISO(CURRENT DATE) → 41 |
QUARTER(dt) | 季度 1-4 | QUARTER(CURRENT DATE) → 4 |
DB2 支援直觀的英文關鍵字運算:
CURRENT DATE + 1 YEAR
CURRENT DATE + 3 YEARS + 2 MONTHS + 15 DAYS
CURRENT TIME + 5 HOURS - 3 MINUTES + 10 SECONDS
CURRENT TIMESTAMP - 2 DAYS
YEAR/YEARS)。
DATE(CURRENT TIMESTAMP) -- 擷取日期部分 → DATE
TIME(CURRENT TIMESTAMP) -- 擷取時間部分 → TIME
TIMESTAMP(CURRENT DATE) -- 日期轉 TIMESTAMP (時間歸零)
TIMESTAMP('2024-10-15 14:30:00') -- 字串轉 TIMESTAMP
DATE('2024-10-15') -- 字串轉 DATE (支援 ISO, USA, EUR, JIS 格式)
TIME('14:30:00') -- 字串轉 TIME
| 函數 | 說明 | 範例 |
|---|---|---|
VARCHAR_FORMAT(ts, 'format') | 依格式字串輸出 VARCHAR | VARCHAR_FORMAT(CURRENT TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS') → '2024-10-15 14:30:45' |
TO_CHAR(ts, 'format') | VARCHAR_FORMAT 同義詞 (Oracle 相容) | 同上 |
CHAR(dt) | 預設格式轉 CHAR (DATE→YYYY-MM-DD, TIME→HH.MM.SS) | CHAR(CURRENT DATE) → '2024-10-15' |
常用格式元素:YYYY, MM, DD, HH24, MI, SS, MS (毫秒), US (微秒), AM/PM, MON (月份縮寫), DY (星期縮寫)。
TIMESTAMP_FORMAT('2024-10-15 14:30:45', 'YYYY-MM-DD HH24:MI:SS')
TO_DATE('2024-10-15', 'YYYY-MM-DD') -- 同義詞
TO_TIMESTAMP('2024-10-15 14:30:45', 'YYYY-MM-DD HH24:MI:SS')
-- 目前 Session 時區位移 (例如 +08:00 → 8*3600 = 28800 秒)
CURRENT TIMEZONE
-- 將本地時間轉為 UTC
CURRENT TIMESTAMP - CURRENT TIMEZONE
CURRENT TIME - CURRENT TIMEZONE
資料庫層面時區由註冊表 DB2_TIMEZONE 或 OS 環境變數 TZ 決定。
TIMESTAMPDIFF(16, CHAR(TIMESTAMP('2024-11-30') - TIMESTAMP('2024-11-08'))) -- 16=天數 → 22
| 引數 | 單位 |
|---|---|
| 1 | 秒的小數部分 |
| 2 | 秒 |
| 4 | 分 |
| 8 | 時 |
| 16 | 天 |
| 32 | 週 |
| 64 | 月 |
| 128 | 季 |
| 256 | 年 |
CREATE FUNCTION secondsdiff(t1 TIMESTAMP, t2 TIMESTAMP)
RETURNS BIGINT
LANGUAGE SQL
DETERMINISTIC
NO EXTERNAL ACTION
READS SQL DATA
RETURN (DAYS(t1) - DAYS(t2)) * 86400 + (MIDNIGHT_SECONDS(t1) - MIDNIGHT_SECONDS(t2));
DAYS(dt):從 0001-01-01 起的天數整數。MIDNIGHT_SECONDS(t):午夜至該時間的秒數 (0-86399)。
CREATE FUNCTION days_in_year(yr INT)
RETURNS INT
LANGUAGE SQL
DETERMINISTIC
NO EXTERNAL ACTION
READS SQL DATA
RETURN CASE
WHEN MOD(yr, 400) = 0 THEN 366
WHEN MOD(yr, 100) = 0 THEN 365
WHEN MOD(yr, 4) = 0 THEN 366
ELSE 365
END;
| 函數 | 說明 | 範例 |
|---|---|---|
DAYS(dt) | 日期轉整數天數 (從 0001-01-01) | DAYS('2024-10-15') → 738765 |
JULIAN_DAY(dt) | 儒略日數 (從公元前 4712-01-01) | JULIAN_DAY(CURRENT DATE) → 2460600 |
MIDNIGHT_SECONDS(t) | 午夜至時間的秒數 | MIDNIGHT_SECONDS('14:30:00') → 52200 |
TIMESTAMP_ISO(dt/t/ts) | 統一轉換為 TIMESTAMP (補零) | TIMESTAMP_ISO(CURRENT DATE) → 2024-10-15-00.00.00.000000 |
LAST_DAY(dt) | 該月最後一天日期 | LAST_DAY(CURRENT DATE) → 2024-10-31 |
熟練掌握 DB2 日期時間函數體系,能優雅解決「本月第一天」、「上季末日」、「精確齡數計算」、「跨時區報表」等常見需求。建議將自訂 secondsdiff、days_in_year 納入專案共用函數庫。