操作日期和時(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ù):DAYS 和 TIMESTAMPDIFF
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ù)。