MySQL日期和時間函數講解 1. NOW、CURRENT_TIMESTAMP和SYSDATE 這些函數都能返回當前的系統時間,它們之間有區別嗎?先來看個例子。 mysql?SELECT?NOW(),CURRENT_TIMESTAMP(),SYSDATE()\G; ***************************?1. row?*************************** NO
MySQL日期和時間函數講解1. NOW、CURRENT_TIMESTAMP和SYSDATE
這些函數都能返回當前的系統時間,它們之間有區別嗎?先來看個例子。
mysql>?SELECT?NOW(),CURRENT_TIMESTAMP(),SYSDATE()\G;從上面的例子看來,3個函數都是返回當前的系統時間,再來看下面這個例子:
mysql>SELECT在上面這個例子中人為地加入了SLEEP函數,讓其等待2秒,這時可以發現SYSDATE返回的時間和NOW及CURRENT_TIMESTAMP是不同的,SYSDATE函數慢了2秒。究其原因是這3個函數有略微區別:
CURRENT_TIMESTAMP是NOW的同義詞,也就是說兩者是相同的。
SYSDATE函數返回的是執行到當前函數時的時間,而NOW返回的是執行SQL語句時的時間。
因此在上面的例子中,兩次執行SYSDATE函數返回不同的時間是因為第二次調用執行該函數時等待了前面SLEEP函數2秒。而對于NOW函數,不管是在SLEEP函數之前還是之后執行,返回的都是執行這條SQL語句時的時間。
2.時間加減函數
先來看一個例子。
mysql>?SELECT?NOW(),NOW()+0\G;可以看到,NOW()函數可以返回時間,也可以返回一個數字,就看用戶如何使用。如果相對當前時間進行增加或減少,并不能直接加上或減去一個數字,而需要使用特定的函數,如DATE_ADD或DATE_SUB,前者表示增加,后者表示減少。其具體的使用方法有DATE_ADD(date,INTERVAL expr unit)和 DATE_SUB(date,INTERVAL expr unit),示例如下:
mysql>?SELECT?NOW()?AS?now,其中expr值可以是正值也可以是負值,因此可以使用DATE_ADD函數來完成DATE_SUB函數的工作,例如:
mysql>?SELECT?NOW()?AS?now,還有一個問題,如果是閏月,那么DATE_ADD函數怎么處理呢?MySQL的默認行為是這樣的:如果目標年份是閏月,那么返回的日期為2月29日;如果不是閏月,那么返回日期是2月28日。示例如下:
mysql>?SELECT?DATE_ADD(’2000-2-29′,INTERVAL 4 YEAR) AS year;?
mysql>?SELECT?DATE_ADD(’2000-2-29′,INTERVAL 1 YEAR) AS year;
+————+
|?year????????|
+————+
|?2001-02-28?|
+————+
1?row in?set?(0.00?sec)
在上面的例子中使用了DAY和YEAR數據類型,其實也可以使用MICROSECOND、SECOND、MINUTE、HOUR、WEEK、MONTH等類型,例如:
mysql>?SELECT?NOW()?AS?now,3. DATE_FORMAT函數
這個函數本身沒有什么需要探討的地方,其作用只是按照用戶的需求格式化打印出日期,例如:
mysql>?SELECT?DATE_FORMAT(NOW(),’%Y%m%d’) AS datetime;但是開發人員往往會錯誤地使用這個函數,導致非常嚴重的后果。例如在需要查詢某一天的數據時,有些開發人員會寫如下的語句:
SELECT * FROM table WHERE DATE_FORMAT(date,’%Y%m%d’)=’xxxx-xx-xx’;
一般來說表中都會有一個對日期類型的索引,如果使用上述的語句,優化器絕對不會使用索引,也不可能通過索引來查詢數據,因此上述查詢的執行效率可能非常低。
1 樓 hunan84229247 2013-10-08聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com