sql中兩個時間類型相減獲得的值

今天有人把數據庫兩個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也很經常使用。
相關文章
相關標籤/搜索