【问题标题】:Why is the current time constant when executing for every row (using a LATERAL JOIN)?为什么执行每一行时的当前时间常数(使用横向连接)?
【发布时间】:2020-07-22 08:51:16
【问题描述】:

为什么在横向连接中包装now() 函数时可以看到相同的时间戳。

我制定了一个代码示例以举例说明:

SELECT *
FROM generate_series(1, 10000)
       LEFT JOIN LATERAL (
  SELECT now() AS now
  ) sub ON TRUE

产生相同的时间戳,例如(修剪):

1, 2020-07-22 08:48:55.038668
2, 2020-07-22 08:48:55.038668
3, 2020-07-22 08:48:55.038668
4, 2020-07-22 08:48:55.038668

我希望每一行都包含一个新的时间戳(按递增顺序),因为 LATERAL 是逐行执行的。

【问题讨论】:

  • 因为它们都是同时从系统中获取的。
  • 如果您需要在语句执行期间更改时间戳,您可以使用 clock_timestamp() 而不是 now() 来获取它,但如果它不是每行都更改,请不要感到惊讶。请参阅下面提到的相同文档。

标签: sql postgresql current-time


【解决方案1】:

这是a documented behavior(强调我的):

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

这里的目的是保证给定事务中函数返回值的一致性。

如果您需要更改每一行的内容,请使用clock_timestamp()

【讨论】:

    猜你喜欢
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 2018-12-21
    • 1970-01-01
    • 2020-08-25
    相关资源
    最近更新 更多