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

DB2 日期時間函數完整參考:抽取、運算、格式化、時區轉換與自訂函數範例

     編輯:DB2 綜合知識

前言

DB2 提供豐富的內建日期時間函數,支援抽取元件、日期運算、格式化輸出、時區調整與差異計算。本文整理完整函數清單、常用語法範例、時區處理技巧、自訂精確秒差函數與閏年判斷函數。

一、元件抽取函數

函數回傳值範例
YEAR(dt)年份 (INTEGER)YEAR(CURRENT TIMESTAMP) → 2024
MONTH(dt)月份 1-12MONTH(CURRENT DATE) → 10
DAY(dt)日期 1-31DAY(CURRENT DATE) → 15
HOUR(dt)小時 0-23HOUR(CURRENT TIME) → 14
MINUTE(dt)分鐘 0-59MINUTE(CURRENT TIME) → 30
SECOND(dt)秒 0-59SECOND(CURRENT TIME) → 45
MICROSECOND(ts)微秒 0-999999MICROSECOND(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-366DAYOFYEAR(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-4QUARTER(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/TIME/TIMESTAMP)。

三、型別轉換與擷取


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')依格式字串輸出 VARCHARVARCHAR_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 (解析)


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 決定。

七、日期時間差異計算

7.1 TIMESTAMPDIFF (估算值,假設每月 30 天)


TIMESTAMPDIFF(16, CHAR(TIMESTAMP('2024-11-30') - TIMESTAMP('2024-11-08')))  -- 16=天數 → 22
引數單位
1秒的小數部分
2秒
4分
8時
16天
32週
64月
128季
256年

7.2 精確秒差 (自訂函數)


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 納入專案共用函數庫。

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