3

我正在写一个查询,您在表格中有票。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;
4

2 回答 2

3

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

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

整个语句的事务开始是恒定的。

于 2020-06-22T13:48:40.817 回答
2

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

是的。它返回当前事务开始时的时间戳,如文档中所述

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

于 2020-06-22T13:48:49.780 回答