首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

DB2 日期時間函數大全:從當前值獲取到複雜運算、格式化、差值計算的完整速查手冊

     編輯:DB2 教學

特殊寄存器:零成本獲取當前時刻

寄存器返回類型示例輸出說明
CURRENT DATEDATE2024-12-31當前日期 (會話時區)
CURRENT TIMETIME23:59:59當前時間 (會話時區)
CURRENT TIMESTAMPTIMESTAMP(6)2024-12-31-23.59.59.123456當前時間戳 (微秒精度)
CURRENT TIMEZONEDECIMAL(6,0)+08:00 → 80000會話時區偏移量 (HHMMSS 格式)

用法:VALUES CURRENT DATE; 或 SELECT CURRENT DATE FROM SYSIBM.SYSDUMMY1; (兼容舊版)。

時區轉換:統一到 UTC/GMT

-- 當前時間轉 UTC
VALUES CURRENT TIME - CURRENT TIMEZONE;

-- 當前時間戳轉 UTC
VALUES CURRENT TIMESTAMP - CURRENT TIMEZONE;

原理:DB2 內部以 UTC 存儲,顯示時套用 CURRENT TIMEZONE;相減即還原 UTC。

分量提取函數:拆解時間維度

函數參數類型返回類型示例
YEAR(dt)DATE/TIMESTAMPINTEGERYEAR(CURRENT TIMESTAMP) → 2024
MONTH(dt)DATE/TIMESTAMPINTEGERMONTH(CURRENT TIMESTAMP) → 12
DAY(dt) / DAYOFMONTH(dt)DATE/TIMESTAMPINTEGERDAY(CURRENT TIMESTAMP) → 31
HOUR(ts)TIME/TIMESTAMPINTEGERHOUR(CURRENT TIMESTAMP) → 23
MINUTE(ts)TIME/TIMESTAMPINTEGERMINUTE(CURRENT TIMESTAMP) → 59
SECOND(ts)TIME/TIMESTAMPINTEGERSECOND(CURRENT TIMESTAMP) → 59
MICROSECOND(ts)TIMESTAMPINTEGERMICROSECOND(CURRENT TIMESTAMP) → 123456
DAYOFWEEK(dt)DATE/TIMESTAMPINTEGER (1=Sun)DAYOFWEEK('2024-12-31') → 3
DAYOFWEEK_ISO(dt)DATE/TIMESTAMPINTEGER (1=Mon)DAYOFWEEK_ISO('2024-12-31') → 2
DAYOFYEAR(dt)DATE/TIMESTAMPINTEGERDAYOFYEAR('2024-12-31') → 366
WEEK(dt) / WEEK_ISO(dt)DATE/TIMESTAMPINTEGERWEEK_ISO('2024-12-31') → 1
QUARTER(dt)DATE/TIMESTAMPINTEGERQUARTER('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)。

兩日期天數差:DAYS() 標量函數

VALUES DAYS(CURRENT DATE) - DAYS('2024-01-01');  -- 返回整數天數差

DAYS() 返回從 0001-01-01 起的絕對天數,相減即得精確天數差 (含閏年)。

字符串雙向轉換

方向函數/語法示例備註
日期時間 → 字符串CHAR(dt)CHAR(CURRENT DATE) → '2024-12-31'格式受區域設置影響
VARCHAR_FORMAT / TO_CHARTO_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 萬能函數

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 等持續時間運算,優化器可自動裁剪分區。
  • 時區一致性:應用層統一傳入 UTC TIMESTAMP,資料庫層 SET CURRENT TIMEZONE = '+00:00' 或會話級 SET TIME ZONE,避免夏令時/跨地域時區混亂。
  • 避免隱式轉換:字符串字面量直接比較 DATE/TIMESTAMP 列時,DB2 會隱式轉換,可能導致索引失效;顯式使用 DATE('...') / TIMESTAMP('...')。

收藏本手冊,覆蓋 DB2 97% 以上日期時間處理場景,從基礎獲取到複雜業務日曆邏輯,實現零查閱、零試錯的高效開發。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved