| 寄存器 | 返回類型 | 示例輸出 | 說明 |
|---|---|---|---|
| CURRENT DATE | DATE | 2024-12-31 | 當前日期 (會話時區) |
| CURRENT TIME | TIME | 23:59:59 | 當前時間 (會話時區) |
| CURRENT TIMESTAMP | TIMESTAMP(6) | 2024-12-31-23.59.59.123456 | 當前時間戳 (微秒精度) |
| CURRENT TIMEZONE | DECIMAL(6,0) | +08:00 → 80000 | 會話時區偏移量 (HHMMSS 格式) |
用法:VALUES CURRENT DATE; 或 SELECT CURRENT DATE FROM SYSIBM.SYSDUMMY1; (兼容舊版)。
-- 當前時間轉 UTC
VALUES CURRENT TIME - CURRENT TIMEZONE;
-- 當前時間戳轉 UTC
VALUES CURRENT TIMESTAMP - CURRENT TIMEZONE;
原理:DB2 內部以 UTC 存儲,顯示時套用 CURRENT TIMEZONE;相減即還原 UTC。
| 函數 | 參數類型 | 返回類型 | 示例 |
|---|---|---|---|
| YEAR(dt) | DATE/TIMESTAMP | INTEGER | YEAR(CURRENT TIMESTAMP) → 2024 |
| MONTH(dt) | DATE/TIMESTAMP | INTEGER | MONTH(CURRENT TIMESTAMP) → 12 |
| DAY(dt) / DAYOFMONTH(dt) | DATE/TIMESTAMP | INTEGER | DAY(CURRENT TIMESTAMP) → 31 |
| HOUR(ts) | TIME/TIMESTAMP | INTEGER | HOUR(CURRENT TIMESTAMP) → 23 |
| MINUTE(ts) | TIME/TIMESTAMP | INTEGER | MINUTE(CURRENT TIMESTAMP) → 59 |
| SECOND(ts) | TIME/TIMESTAMP | INTEGER | SECOND(CURRENT TIMESTAMP) → 59 |
| MICROSECOND(ts) | TIMESTAMP | INTEGER | MICROSECOND(CURRENT TIMESTAMP) → 123456 |
| DAYOFWEEK(dt) | DATE/TIMESTAMP | INTEGER (1=Sun) | DAYOFWEEK('2024-12-31') → 3 |
| DAYOFWEEK_ISO(dt) | DATE/TIMESTAMP | INTEGER (1=Mon) | DAYOFWEEK_ISO('2024-12-31') → 2 |
| DAYOFYEAR(dt) | DATE/TIMESTAMP | INTEGER | DAYOFYEAR('2024-12-31') → 366 |
| WEEK(dt) / WEEK_ISO(dt) | DATE/TIMESTAMP | INTEGER | WEEK_ISO('2024-12-31') → 1 |
| QUARTER(dt) | DATE/TIMESTAMP | INTEGER | QUARTER('2024-12-31') → 4 |
-- 從 TIMESTAMP 截取 DATE / TIME
VALUES DATE(CURRENT TIMESTAMP); -- 2024-12-31
VALUES TIME(CURRENT TIMESTAMP); -- 23:59:59
-- 字符串格式化 (9.7+)
VALUES VARCHAR_FORMAT(CURRENT TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS'); -- 2024-12-31 23:59:59
VALUES TO_CHAR(CURRENT TIMESTAMP, 'YYYY-MM-DD'); -- 別名
-- 組裝 DATE/TIME/TIMESTAMP
VALUES TIMESTAMP('2024-12-31', '23:59:59'); -- 2024-12-31-23.59.59.000000
VALUES TIMESTAMP('2024-12-31 23:59:59.123456'); -- ISO 格式自動識別
DB2 支援 datetime + duration / datetime - duration,持續時間分為 標記持續時間 (年/月/日/時/分/秒) 與 標準持續時間 (DECIMAL 編碼)。
-- 標記持續時間 (關鍵字)
VALUES CURRENT DATE + 1 YEAR;
VALUES CURRENT DATE + 3 YEARS + 2 MONTHS + 15 DAYS;
VALUES CURRENT TIME + 5 HOURS - 3 MINUTES + 10 SECONDS;
VALUES CURRENT TIMESTAMP + 1 DAY - 2 HOURS;
-- 標準持續時間 (DECIMAL(8,0) 格式 YYYYMMDD / DECIMAL(6,0) HHMMSS)
VALUES CURRENT DATE + 10001; -- +1 年 1 天 (2025-01-01)
VALUES CURRENT TIME + 10000; -- +1 小時
陷阱:月份加減遇月末會自動調整至該月最後一天 (如 1/31 + 1 MONTH → 2/28 或 2/29)。
VALUES DAYS(CURRENT DATE) - DAYS('2024-01-01'); -- 返回整數天數差
DAYS() 返回從 0001-01-01 起的絕對天數,相減即得精確天數差 (含閏年)。
| 方向 | 函數/語法 | 示例 | 備註 |
|---|---|---|---|
| 日期時間 → 字符串 | CHAR(dt) | CHAR(CURRENT DATE) → '2024-12-31' | 格式受區域設置影響 |
| VARCHAR_FORMAT / TO_CHAR | TO_CHAR(CURRENT TIMESTAMP, 'YYYY-MM-DD') | 推薦,可控格式 | |
| 字符串 → 日期時間 | DATE('str') | DATE('2024-12-31'), DATE('12/31/2024') | 自動識別多種格式 |
| TIME('str') | TIME('23:59:59'), TIME('23.59.59') | ||
| TIMESTAMP('str') | TIMESTAMP('2024-12-31-23.59.59.123456'), TIMESTAMP('2024-12-31 23:59:59') | ISO 格式最安全 |
TIMESTAMPDIFF(interval, timestamp_duration_string) 返回指定間隔單位的整數差值 (截斷向零)。
| 間隔常量 | 單位 | 示例 (相差 1 年) |
|---|---|---|
| 1 | 微秒分數 (秒的小數部分) | ~31,556,926,000,000 |
| 2 | 秒 | 31,536,000 |
| 4 | 分 | 525,600 |
| 8 | 時 | 8,760 |
| 16 | 天 | 365 |
| 32 | 周 | 52 |
| 64 | 月 | 12 |
| 128 | 季度 | 4 |
| 256 | 年 | 1 |
-- 計算到 2024 年底還有多少天
VALUES TIMESTAMPDIFF(16, CHAR(CURRENT TIMESTAMP - TIMESTAMP('2024-12-31-23.59.59')));
-- 計算員工入職年限 (整年)
VALUES TIMESTAMPDIFF(256, CHAR(CURRENT TIMESTAMP - TIMESTAMP(HIREDATE)));
-- 計算訂單處理耗時 (分鐘)
VALUES TIMESTAMPDIFF(4, CHAR(ORDER_COMPLETE_TS - ORDER_CREATE_TS));
注意:參數 2 必須是 CHAR(timestamp1 - timestamp2),差值結果為 時間戳持續時間字符串 (格式 YYYY-MM-DD-HH.MM.SS.NNNNNN)。
-- 本月第一天
VALUES CURRENT DATE - (DAY(CURRENT DATE) - 1) DAYS;
-- 本月最後一天
VALUES (CURRENT DATE + 1 MONTH) - DAY(CURRENT DATE + 1 MONTH) DAYS;
-- 下一個工作日 (簡易版,排除週末)
VALUES CASE DAYOFWEEK(CURRENT DATE + 1 DAY)
WHEN 1 THEN CURRENT DATE + 2 DAYS -- 週日→週二
WHEN 7 THEN CURRENT DATE + 2 DAYS -- 週六→週一
ELSE CURRENT DATE + 1 DAY
END;
-- 年齡計算 (精確到年)
VALUES YEAR(CURRENT DATE) - YEAR(BIRTHDATE) -
CASE WHEN MONTH(CURRENT DATE) < MONTH(BIRTHDATE)
OR (MONTH(CURRENT DATE) = MONTH(BIRTHDATE) AND DAY(CURRENT DATE) < DAY(BIRTHDATE))
THEN 1 ELSE 0 END;
WHERE CREATE_TS >= CURRENT TIMESTAMP - 7 DAYS 可走索引;WHERE DATE(CREATE_TS) = CURRENT DATE 導致函數計算全表掃描。CURRENT DATE - 1 MONTH 等持續時間運算,優化器可自動裁剪分區。SET CURRENT TIMEZONE = '+00:00' 或會話級 SET TIME ZONE,避免夏令時/跨地域時區混亂。DATE('...') / TIMESTAMP('...')。收藏本手冊,覆蓋 DB2 97% 以上日期時間處理場景,從基礎獲取到複雜業務日曆邏輯,實現零查閱、零試錯的高效開發。