今天有人把數據庫兩個time類型的字段查出來並作了減法,獲得一個長形的數字。這個數字是什麼?java
首先在數據庫裏創建一張test表(mysql的數據庫)mysql
CREATE TABLE `NewTable` (
`id` int(10) NOT NULL AUTO_INCREMENT ,
`time1` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP ,
`time2` timestamp NULL DEFAULT NULL ,
PRIMARY KEY (`id`)
)
而後錄入兩條數據,用以下語句查詢
SELECT time2,time1,time2-time1 FROM `test`;
查詢結果以下,結論是這個差值1的單位貌似是秒。
2012-05-15 19:02:17 2012-05-15 19:02:16 1sql
把time1和time2的類型改爲date。這個結果的單位是0.
把time1和time2的類型改爲datetime,這個結果以下,貌似單位仍是秒。
2012-05-15 19:02:16
2012-05-15 19:02:17
-1.000000
今天遇到的數字結果不肯定的情形並無復現,難道數據庫是由於數據庫的類型是oracle?
先記到這裏吧,這個時間減法仍是不要亂用。mysql有計算時間差的函數datediff(),咱們測試一下
SELECT time2,time1,time2-time1,DATEDIFF(time2,time1) FROM `test`;
獲得結果以下:
2012-05-15 19:02:16
2012-05-15 19:02:17
-1.000000
0
結果竟然是0...本身猜了一下,原來還有timediff() 這個函數,再從新測試一下:
SELECT time2,time1,time2-time1,TIMEDIFF(time2,time1) FROM `test`;
此次的結果就對了,結果的單位是秒
2012-05-15 19:02:16
2012-05-15 19:02:17
-1.000000
-00:00:01
好吧,數據庫這邊要多熟悉幾個時間函數。在記一個now()函數的用法。now()用來獲取當前時間,返回的是一個秒爲單位的時間,可是返回時+0,這是就是一個串了,頗有意思。
select NOW(),NOW()+0;
返回的結果,能夠用他來獲取一個串做爲ID也不錯嘛。
2012-05-15 19:20:44
20120515192044.000000
再來兩個函數,今天計算最近七天的記錄是用到的一個函數。date_add()和date_sub()
select DATE_ADD(now(), Interval 1 month);
SELECT DATE_SUB(NOW(), INTERVAL 1 MONTH);
返回的結果以下,後面的差值是能夠變的。
2012-05-15 19:27:47
2012-04-15 19:27:47
2012-06-15 19:27:47
後面的差值我偷個懶,上網摘了一下,沒作試驗
SECOND 秒 SECONDS
MINUTE 分鐘 MINUTES
HOUR 時間 HOURS
DAY 天 DAYS
MONTH 月 MONTHS
YEAR 年 YEARS
MINUTE_SECOND 分鐘和秒 "MINUTES:SECONDS"
HOUR_MINUTE 小時和分鐘 "HOURS:MINUTES"
DAY_HOUR 天和小時 "DAYS HOURS"
YEAR_MONTH 年和月 "YEARS-MONTHS"
HOUR_SECOND 小時, 分鐘, "HOURS:MINUTES:SECONDS"
DAY_MINUTE 天, 小時, 分鐘 "DAYS HOURS:MINUTES"
DAY_SECOND 天, 小時, 分鐘, 秒 "DAYS HOURS:MINUTES:SECONDS"
原本在java上作了一個實驗。也貼出來吧。
public static void main(String[] args) {
Calendar calendar=new GregorianCalendar(2012, 5, 10, 21, 12,44);
Calendar calendar2=new GregorianCalendar(2012,5, 10, 21, 12,43);
System.out.println(calendar.getTimeInMillis()-calendar2.getTimeInMillis());
}
這個結果是1000,單位是毫秒。
/**
*20120522 補充
*/
今天遇到一個問題,oracle裏,一個字段是date類型,怎麼找再某天以後的記錄。
用dateColumn>to_date('2012-05-02','yyyy-mm-dd');
若是字段是timestamp類型時,一樣能夠,最開始用的是相減大於0的寫法,結果報錯了。
總結一下,mysql中時間相減好像和函數沒有什麼區別,差值和字段類型有關。沒有出現下午提到的不知道數據的現象。另外要熟悉幾個時間函數。java裏出來時間的函數爲calendar,另外simpledateformate和date也很經常使用。