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 |
<b>兩者的差別在于對于一個語句中調用多個函數</b>
<b>now() 傳回語句調用時的值,在存過或者trigger 中now()傳回的值是存過或者trigger 執行的時刻的時間。</b>
<b>sysdate() 傳回調用該函數的時刻的時間值。</b>
<b>舉例說明兩者之間的差別:</b>
root@rac1 21:07:16> select now(),sleep(3),now(); <b>-傳回的時間是一緻的。</b>
+---------------------+----------+---------------------+
| 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 |
<b>上述查詢傳回sysdate()函數被調用的時刻的時間值。</b>
還有另外一個時間相關的函數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 |
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模式的複制環境。