【问题标题】:Postgres: is NOW() used in more places of the query guaranteed to be always the same?Postgres:在查询的更多地方使用 NOW() 是否保证始终相同?
【发布时间】:2020-06-22 13:46:26
【问题描述】:

我正在编写一个查询,其中您在表中有门票。 first_use_on 列表示第一次使用的 TIMESTAMP。 first_use_on 默认为 NULL,然后仅在第一次使用时更新。我的查询工作正常,但现在我需要在查询之外知道运行的查询是否触发了 first_use_on,所以我考虑在 RETURNING 中添加first_use_on = NOW() AS is_first_usage。我可以 100% 确定返回中比较的 NOW() 始终与 UPDATE 部分中使用的相同吗?会不会有一些不同的情况?

UPDATE
    l_codes
SET first_use_on = (
    CASE WHEN first_use_on IS NULL THEN 
        NOW()
    ELSE 
        first_use_on 
    END )
WHERE
    l_code = 'C9TCH' AND id_mostra = 1
RETURNING 
    first_use_on,
    first_use_on = NOW() AS is_first_usage,
    NOW() > DATE_TRUNC('day', first_use_on + INTERVAL '1 DAY') AS expired,
    DATE_TRUNC('day', first_use_on + INTERVAL '1 DAY') AS expiration_on;

【问题讨论】:

    标签: sql postgresql date current-time


    【解决方案1】:

    是的。如now() 的文档中所述:

    由于这些函数返回当前事务的开始时间,因此它们的值在事务期间不会改变。这被认为是一个特性:目的是允许单个事务具有一致的“当前”时间概念,以便同一事务中的多个修改具有相同的时间戳。

    整个语句的事务开始是不变的。

    【讨论】:

      【解决方案2】:

      Postgres:NOW() 在查询的更多地方使用是否保证始终相同?

      是的。它返回当前事务开始时的时间戳,如explained in the documentation

      由于这些函数返回当前事务的开始时间,因此它们的值在事务期间不会改变。这被认为是一个特性:目的是允许单个事务具有一致的“当前”时间概念,以便同一事务中的多个修改具有相同的时间戳。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-05
        • 2013-08-14
        • 1970-01-01
        • 2016-07-14
        • 2012-01-29
        • 1970-01-01
        • 2019-02-21
        • 1970-01-01
        相关资源
        最近更新 更多