操作日期和時(shí)間

操作日期和時(shí)間

標(biāo)簽(空格分隔): SQL DB2


我們都知道數(shù)字可以進(jìn)行加、減、乘、除等運(yùn)算。那么,日期時(shí)間可不可以呢?答案是,日期只能進(jìn)行、運(yùn)算。

日期數(shù)據(jù)類型

在開始操作日期之前,我們得先了解DB2 支持哪些日期時(shí)間數(shù)據(jù)類型,如下所示:

類型 格式
TIME hh:mm:ss
DATE yyyy-mm-dd
TIMESTAMP yyyy-mm-dd hh:mm:ss.zzzzzz

日期時(shí)間運(yùn)算:Case 1

下面,我們還是先看一個(gè)簡(jiǎn)單的例子吧,如下所示:

    VALUES DATE('2009-10-1') + 1 DAY; 
    VALUES DATE('2009-10-1') + 5 DAYS; 

如上所示,我們可以以人類英語的方式來操作日期,那么,除了DAY和DAYS之外,DB2還支持哪些關(guān)鍵字呢?如下所示:

單數(shù) 復(fù)數(shù)
YEAR YEARS
MONTH MONTHS
DAY DAYS
HOUR HOURS
MINUTE MINUTES
SECOND SECONDS
MICROSECOND MICROSECONDS

單數(shù)和復(fù)數(shù)關(guān)鍵字在使用上沒有任何區(qū)別,之所以分單數(shù)和復(fù)數(shù),可能是考慮英語的語言習(xí)慣。下面是一些簡(jiǎn)單的例子:

VALUES DATE('2009-10-1') + 1 YEAR + 2 MONTH -8 DAY;
VALUES TIME('10:23:15') + 3 HOUR -26 MINUTE;  
VALUES TIMESTAMP('2009-10-1 10:23:15.000000') - 3 SECOND + 450 MICROSECOND;  

怎么樣?使用起來是不是非常簡(jiǎn)單。不過,還有個(gè)問題我們需要思考,如果給DATE類型日期加上2小時(shí),或者給TIME類型的日期加上1年會(huì)出現(xiàn)怎樣的情況呢?請(qǐng)讀者自己運(yùn)行下面的代碼找答案吧。

VALUES DATE('2009-10-1') + 2 HOUR; 
VALUES TIME('10:23:15') + 1 YEAR; 

日期時(shí)間運(yùn)算:Case 2

有時(shí)候,我們需要知道兩個(gè)日期之間相隔多少天,也就是說求日期之間的時(shí)間間隔,該怎么辦呢?我們很自然的想到把兩個(gè)日期相減,如下所示:

--錯(cuò)誤例子
VALUES DATE('2009-10-1') - DATE('2008-10-1');  
VALUES TIME('10:23:15') - TIME('10:22:15');  
VALUES TIMESTAMP('2009-10-1 10:23:15.000005') - TIMESTAMP('2009-10-1 10:22:15.000000');  

運(yùn)行上面的語句后,你可能感覺很失望,答案并不是我們期望的結(jié)果。上面的語句,首先將日期類型轉(zhuǎn)換為DECIMAL類型,然后進(jìn)行減法運(yùn)算。轉(zhuǎn)換規(guī)則如下:

日期 DECIMAL 轉(zhuǎn)換后的格式
DATE DECIMAL(8,0) yyyymmdd
TIME DECIMAL(6,0) hhmmss
TIMESTAMP DECIMAL(20,6) yyyymmdd hhmmss.zzzzzz

所以,上面的三條語句的結(jié)果如下:

    20091001-20081001=10000;  
    102315-102215=100;  
    20091001102315.000005-20091001102215.000000=100.000005;  

那么,到底該怎樣求時(shí)間間隔呢?下面給大家介紹兩個(gè)函數(shù):DAYSTIMESTAMPDIFF

DAYS

DAYS 函數(shù)可以用來求兩個(gè)日期的天數(shù),如下SQL所示:

VALUES DAYS(DATE('2009-10-1') ) - DAYS(DATE('2008-10-1')) ;  
VALUES DAYS('2009-10-2' ) - DAYS('2009-10-1 10:40:15.000000') ;  
VALUES DAYS(TIMESTAMP('2009-10-2 10:23:15.000005'))  - DAYS(TIMESTAMP('2009-10-1 10:40:15.000000'));  

TIMESTAMPDIFF

DAYS 函數(shù)只能用來求兩個(gè)日期之間天數(shù),不夠靈活。更靈活的是TIMESTAMPDIFF函數(shù),TIMESTAMPDIFF函數(shù)的定義如下:

TIMESTAMPDIFF (參數(shù)1,參數(shù)2)

參數(shù)1可以指定為:1、2、4、8、16、32、64、128、256,分別表示返回兩個(gè)日期之間的毫秒數(shù)、秒數(shù)、分鐘數(shù)、小時(shí)數(shù)、天數(shù)、周數(shù)、月數(shù)、季度數(shù)、年數(shù)

參數(shù)2是兩個(gè)日期相減的結(jié)果,如下SQL所示:

VALUES TIMESTAMPDIFF(1, CHAR(TIMESTAMP('2009-10-1 10:23:16.000000') -TIMESTAMP('2009-10-1 10:23:15.000000')));  
VALUES TIMESTAMPDIFF(2, CHAR(TIMESTAMP('2009-10-1 10:23:15.000000') -TIMESTAMP('2008-10-1 10:23:15.000000')));  
VALUES TIMESTAMPDIFF(4, CHAR(TIMESTAMP('2009-10-1 10:23:15.000000') -TIMESTAMP('2008-10-1 10:23:15.000000')));  
VALUES TIMESTAMPDIFF(8, CHAR(TIMESTAMP('2009-10-1 10:23:15.000000') -TIMESTAMP('2008-10-1 10:23:15.000000')));  
VALUES TIMESTAMPDIFF(16, CHAR(TIMESTAMP('2009-10-1 10:23:15.000000') -TIMESTAMP('2008-10-1 10:23:15.000000')));  
VALUES TIMESTAMPDIFF(32, CHAR(TIMESTAMP('2009-10-1 10:23:15.000000') -TIMESTAMP('2008-10-1 10:23:15.000000')));  
VALUES TIMESTAMPDIFF(64, CHAR(TIMESTAMP('2009-10-1 10:23:15.000000') -TIMESTAMP('2008-10-1 10:23:15.000000')));  
VALUES TIMESTAMPDIFF(128, CHAR(TIMESTAMP('2009-10-1 10:23:15.000000') -TIMESTAMP('2008-10-1 10:23:15.000000')));  
VALUES TIMESTAMPDIFF(256, CHAR(TIMESTAMP('2009-10-1 10:23:15.000000') -TIMESTAMP('2008-10-1 10:23:15.000000')));  

有關(guān)日期的操作還有很多,請(qǐng)參考日期時(shí)間函數(shù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容