-- 標準查詢方式
SELECT CURRENT DATE FROM SYSIBM.SYSDUMMY1;
SELECT CURRENT TIME FROM SYSIBM.SYSDUMMY1;
SELECT CURRENT TIMESTAMP FROM SYSIBM.SYSDUMMY1;
-- CLP 快捷方式
VALUES CURRENT DATE;
VALUES CURRENT TIME;
VALUES CURRENT TIMESTAMP;
SYSIBM.SYSDUMMY1 為內存虛擬表,專供標量函數/暫存器求值。
CURRENT TIME - CURRENT TIMEZONE
CURRENT TIMESTAMP - CURRENT TIMEZONE
YEAR(CURRENT TIMESTAMP), MONTH(...), DAY(...)
HOUR(...), MINUTE(...), SECOND(...), MICROSECOND(...)
DATE(CURRENT TIMESTAMP) -- 只要日期部份
TIME(CURRENT TIMESTAMP) -- 只要時間部份
CURRENT DATE + 1 YEAR
CURRENT DATE + 3 YEARS + 2 MONTHS + 15 DAYS
CURRENT TIME + 5 HOURS - 3 MINUTES + 10 SECONDS
DAYS(CURRENT DATE) - DAYS(DATE('1999-10-22'))
CURRENT TIMESTAMP - MICROSECOND(CURRENT TIMESTAMP) MICROSECONDS
-- 日期/時間/時間戳 → 字串
CHAR(CURRENT DATE)
CHAR(CURRENT TIME)
CHAR(CURRENT DATE + 12 HOURS)
-- 字串 → 日期/時間/時間戳 (支援多種格式)
TIMESTAMP('2002-10-20-12.00.00.000000')
TIMESTAMP('2002-10-20 12:00:00')
DATE('2002-10-20')
DATE('10/20/2002')
TIME('12:00:00')
TIME('12.00.00')
SELECT DATE(2001-09-22) FROM SYSIBM.SYSDUMMY1; -- 錯誤!無引號視為數值運算
-- 結果:05/24/0006 (相差近 2000 年)
原因:無引號時 DB2 視為數值 (2001-9)-22 = 1970,解釋為「第 1970 天」(從 0001-01-01 起算)。務必加引號:DATE('2001-09-22')。
內建 TIMESTAMPDIFF 為近似值 (假設每月 30 天、不考慮閏年)。精確到秒的自訂函數:
CREATE FUNCTION SECONDSDIFF(t1 TIMESTAMP, t2 TIMESTAMP)
RETURNS INT
RETURN ( (DAYS(t1) - DAYS(t2)) * 86400
+ (MIDNIGHT_SECONDS(t1) - MIDNIGHT_SECONDS(t2)) ) @
CREATE FUNCTION DAYSINYEAR(yr INT)
RETURNS INT
RETURN CASE MOD(yr,400) WHEN 0 THEN 366
ELSE CASE MOD(yr,4) WHEN 0 THEN
CASE MOD(yr,100) WHEN 0 THEN 365 ELSE 366 END
ELSE 365 END END @
用法:VALUES DAYSINYEAR(2024) → 366。
| 數值 | 單位 |
|---|---|
| 1 | 微秒 |
| 2 | 秒 |
| 4 | 分 |
| 8 | 時 |
| 16 | 天 |
| 32 | 週 |
| 64 | 月 |
| 128 | 季 |
| 256 | 年 |