【MySQL】now()與sysdate()的區別

楊奇龍發表於2013-01-12
now()與sysdate()兩個函式都以'YYYY-MM-DD HH:MM:SS'的形式表示表示當前的時間。比如:
root@rac1 21:13:10> select sysdate();                   
+---------------------+
| sysdate()           |
+---------------------+
| 2013-01-12 21:14:21 |
+---------------------+
1 row in set (0.00 sec)

root@rac1 21:14:21> select now();    
+---------------------+
| now()               |
+---------------------+
| 2013-01-12 21:14:29 |
+---------------------+
1 row in set (0.00 sec)
兩者的區別在於對於一個語句中呼叫多個函式
NOW()     返回語句呼叫時的值,在存過或者trigger 中now()返回的值是存過或者trigger 執行的時刻的時間。
SYSDATE() 返回撥用該函式的時刻的時間值。
舉例說明兩者之間的區別:
root@rac1 21:07:16> select now(),sleep(3),now(); -返回的時間是一致的。  
+---------------------+----------+---------------------+
| now()               | sleep(3) | now()               |
+---------------------+----------+---------------------+
| 2013-01-12 21:07:30 |        0 | 2013-01-12 21:07:30 |
+---------------------+----------+---------------------+
1 row in set (3.00 sec)

root@rac1 21:10:23> select sysdate(),sleep(2),sysdate();       
+---------------------+----------+---------------------+
| sysdate()           | sleep(2) | sysdate()           |
+---------------------+----------+---------------------+
| 2013-01-12 21:11:06 |        0 | 2013-01-12 21:11:08 |
+---------------------+----------+---------------------+
上述查詢返回sysdate()函式被呼叫的時刻的時間值。
還有另外一個時間相關的函式current_timestamp() 與now()一致。
root@rac1 21:07:33> select now(),current_timestamp(),sysdate();
+---------------------+---------------------+---------------------+
| now()               | current_timestamp() | sysdate()           |
+---------------------+---------------------+---------------------+
| 2013-01-12 21:09:59 | 2013-01-12 21:09:59 | 2013-01-12 21:09:59 |
+---------------------+---------------------+---------------------+
1 row in set (0.00 sec)
root@rac1 21:10:08> select now(),sleep(2),current_timestamp(); 
+---------------------+----------+---------------------+
| now()               | sleep(2) | current_timestamp() |
+---------------------+----------+---------------------+
| 2013-01-12 21:10:21 |        0 | 2013-01-12 21:10:21 |
+---------------------+----------+---------------------+
1 row in set (2.00 sec)

當sysdate函式在基於satement 模式的主從環境下可能造成資料的不一致。因為語句在主庫中執行到日誌傳遞到備庫,存在時間差,到備庫執行的時候就會變成不同的時間值。
解決方法:
1 透過設定sysdate-is-now引數,使mysql對於sysdate呼叫採用和now一樣的行為,配置該引數的時候要在主備同事配置。
2 採取row模式的複製環境。
參考資料:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22664653/viewspace-752576/,如需轉載,請註明出處,否則將追究法律責任。

相關文章