【问题标题】:SQL NOW() in long running query长时间运行的查询中的 SQL NOW()
【发布时间】:2011-07-28 05:12:33
【问题描述】:

假设我有长时间运行更新查询

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

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

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

【问题讨论】:

    标签: sql time timestamp


    【解决方案1】:

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

    这个答案太短了吗?

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

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

    不过,阅读 SYSDATE() 的手册条目实际上更有趣,其中包含这个 sn-p

    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
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    相关资源
    最近更新 更多