SQL NOW()在长时间运行的查询中

时间:2011-04-02 10:41:56

标签: sql time timestamp

说我已经运行了很长时间的更新查询

update some_table 
set modification_time = now() 
where (something incredibly complex);

some_table中的modification_time值是多少?它们是相同还是不同(比如,执行查询需要2天)。

如果它们不同,我该如何编写此查询以使它们都相同?

1 个答案:

答案 0 :(得分:8)

它们都是相同的,因为NOW()在查询开始时被锁定。

这个答案太短了吗?

好的,更多信息MySQL reference for NOW()

  

NOW()返回常量时间,表示语句开始执行的时间。 (在存储的函数或触发器中,NOW()返回函数或触发语句开始执行的时间。)这与SYSDATE()的行为不同,后者返回执行它的确切时间。

阅读SYSDATE()的手册条目实际上更有意思,其中包含此代码段

mysql> SELECT NOW(), SLEEP(2), NOW();
+---------------------+----------+---------------------+
| NOW()               | SLEEP(2) | NOW()               |
+---------------------+----------+---------------------+
| 2006-04-12 13:47:36 |        0 | 2006-04-12 13:47:36 |
+---------------------+----------+---------------------+

mysql> SELECT SYSDATE(), SLEEP(2), SYSDATE();
+---------------------+----------+---------------------+
| SYSDATE()           | SLEEP(2) | SYSDATE()           |
+---------------------+----------+---------------------+
| 2006-04-12 13:47:44 |        0 | 2006-04-12 13:47:46 |
+---------------------+----------+---------------------+

你问的是什么有趣...... 注意你可以在查询中 SLEEP 吗?考虑这个查询(子查询只是模拟一个3记录表)

select *, now(), sleep(2), sysdate()
from (select 1 N union all select 2 union all select 3) M

你得到:

N   now()           sleep(2)  sysdate()
1   2011-04-02 23:55:27   0   2011-04-02 23:55:29
2   2011-04-02 23:55:27   0   2011-04-02 23:55:31
3   2011-04-02 23:55:27   0   2011-04-02 23:55:33