【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 |
+---------------------+
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模式的复制环境。
参考资料:
上一篇:Class.newInstance()与new、Constructor.newInstance()的区别


下一篇:malloc和new有什么区别