天天看點

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

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&gt; 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&gt; 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&gt; 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&gt; 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模式的複制環境。

繼續閱讀