1.前言
mysql提供的函数now
和sysdate
都是用来获取当前的日期和时间。不同的是,now
会在sql开始执行时就固定下来,而sysdate
会在执行过程中计算。简单说,now
是静态的,sysdate
是动态的。
2.实验
现在表的初始化情况如下:
现在db4的test表有10w条记录,其中birthday字段是timestamp
类型。
现在对全表进行更新操作,分别使用now
和sysdate
函数将birthday设置为当前时间。
2.1使用sysdate函数
sysdate(3)
代表获得的时间信息保留3位毫秒
使用sysdate函数更新全表后,发现更新后各行的birthday不是一致的,而是随着一行一行的更新,时间也在增加。这说明了sysdate函数是在执行的过程中解析的
2.2使用now函数
使用now函数更新后,发现整个表的birthday字段值都是一样的。这说明now函数不是在执行的过程中一步步生成的(每更新一行,都为这行生成当前的时间),而是在update这个语句最开始执行的时候,now就已经执行并固定下来了,后面随着时间的推移而更新时,now始终不变
3.官网说明
now
在语句开始执行就计算出来了并作为常量,语句中后续用到now的地方都会是相同值。sysdate
在执行过程中动态解析
所以可以看到官网的例子中,休眠2s前后,now返回的是相同的值,sysdate返回的是差了2s的值
(吐槽:谷歌自带的翻译怎么这么拉,“这与sysdate()的行为不同”硬是整成了”这与的行为不同sysdate()“)