长时间运行的SQL查询中的NOW()函数问题

5

假设我有一个长时间运行的更新查询。

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

some_table中的modification_time值会是什么?它们会相同还是不同(比如,查询花费了2天的时间)。

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

1个回答

10

这些值都将相同,因为NOW()被锁定在查询开始时的时间。

这个回答太简短了吗?

好的,更多信息请参考MySQL对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 |
+---------------------+----------+---------------------+

你问什么那么有趣.. 注意到你可以在查询中休眠吗?? 考虑这个查询(子查询只是模拟一个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

我只希望Oracle SQL也是一样的!;) - 0xDEAD BEEF
@0xD Oracle没有NOW()函数吗?它使用SYSDATE代替,但是在这里阅读更多信息:http://rwijk.blogspot.com/2008/07/sysdate.html - RichardTheKiwi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接