DB2時間日期函數
1 、要使用 SQL 獲得當前的日期、時間及時間戳記,參考適當的 DB2 寄存器:
www.2cto.com
SELECT current date FROM sysibm.sysdummy1
SELECT current time FROM sysibm.sysdummy1
SELECT current timestamp FROM sysibm.sysdummy1
說明:ysibm.sysdummy1 表是一個特殊的內存中的表,用它可以發現如上面演示的 DB2 寄存器的值
2 、日期函數:給定了日期、時間或時間戳記,則使用適當的函數可以單獨抽取出(如果適用的話)年、月、日、時、分、秒及微秒各部分:
YEAR (current timestamp)
MONTH (current timestamp)
DAY (current timestamp)
HOUR (current timestamp)
MINUTE (current timestamp)
SECOND (current timestamp)
MICROSECOND (current timestamp)
從時間戳記單獨抽取出日期和時間也非常簡單:
www.2cto.com
DATE (current timestamp)
TIME (current timestamp)
3 、還可以使用英語來執行日期和時間計算:
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'))
如果想將日期或時間值與其它文本相銜接,那麼需要先將該值轉換成字符串。為此,只要使用 CHAR() 函數:
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')
TIMESTAMP() 、DATE() 和 TIME() 函數接受更多種格式。
警告:
摘自 DB2 UDB V8.1 SQL Cookbook ,作者 Graeme Birchall
如果你在日期函數中偶然地遺漏了引號,那將如何呢?結論是函數會工作,但結果會出錯:
SELECT DATE(2001-09-22) FROM SYSIBM.SYSDUMMY1;
結果: 05/24/0006
為什麼會產生將近 2000 年的差距呢?當 DATE 函數得到了一個字符串作為輸入參數的時候,它會假定這是一個有效的 DB2 日期的表示,並對其進行適當地轉換。相反,當輸入參數是數字類型時,函數會假定該參數值減 1 等於距離公元第一天(0001-01-01 )的天數。在上面的例子中,我們的輸入是 2001-09-22 ,被理解為 (2001-9)-22, 等於 1970 天,於是該函數被理解為 DATE(1970) 。
日期函數
有時,您需要知道兩個時間戳記之間的時差。為此,DB2 提供了一個名為 TIMESTAMPDIFF() 的內置函數。但該函數返回的是近似值,因為它不考慮閏年,而且假設每個月只有 30 天。以下示例描述了如何得到兩個日期的近似時差:
timestampdiff (<n>, char(timestamp('2002-11-30-00.00.00')-timestamp('2002-11-08-00.00.00')))
對於 <n> ,可以使用以下各值來替代,以指出結果的時間單位:
· 1 = 秒的小數部分
· 2 = 秒
· 4 = 分
· 8 = 時
· 16 = 天
· 32 = 周
· 64 = 月
· 128 = 季度
· 256 = 年
當日期很接近時使用 timestampdiff() 比日期相差很大時精確。如果需要進行更精確的計算,可以使用以下方法來確定時差(按秒計):
(DAYS(t1) - DAYS(t2)) * 86400 + (MIDNIGHT_SECONDS(t1) - MIDNIGHT_SECONDS(t2))
為方便起見,還可以對上面的方法創建 SQL 用戶定義的函數:
CREATE FUNCTION secondsdiff(t1 TIMESTAMP, t2 TIMESTAMP) RETURNS INT
RETURN (
(DAYS(t1) - DAYS(t2)) * 86400 +
(MIDNIGHT_SECONDS(t1) - MIDNIGHT_SECONDS(t2))
)
如果需要確定給定年份是否是閏年,以下是一個很有用的 SQL 函數,您可以創建它來確定給定年份的天數:
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)
改變日期格式
在日期的表示方面,這也是我經常碰到的一個問題。用於日期的缺省格式由數據庫的地區代碼決定,該代碼在數據庫創建的時候被指定。例如,我在創建數據庫時使用 territory=US 來定義地區代碼,則日期的格式就會像下面的樣子:
values current date
1
www.2cto.com
----------
05/30/2003
1 record(s) selected.
也就是說,日期的格式是 MM/DD/YYYY. 如果想要改變這種格式,你可以通過綁定特定的 DB2 工具包來實現. 其他被支持的日期格式包括:
DEF
使用與地區代碼相匹配的日期和時間格式。
EUR
使用歐洲日期和時間的 IBM 標准格式。
ISO
使用國際標准組織(ISO )制訂的日期和時間格式。
JIS
使用日本工業標准的日期和時間格式。
www.2cto.com
LOC
使用與數據庫地區代碼相匹配的本地日期和時間格式。
USA
使用美國日期和時間的 IBM 標准格式。