now() 和 current_timestamp 的区别

Joh*_*ino 69 postgresql timestamp

在 PostgreSQL 中,我使用now()andcurrent_timestamp函数,我看不出有什么区别:

# SELECT now(), current_timestamp;
              now               |              now               
--------------------------------+--------------------------------
 04/20/2014 19:44:27.215557 EDT | 04/20/2014 19:44:27.215557 EDT
(1 row)
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

Erw*_*ter 91

没有什么区别手册中的三句话:

1)

这些 SQL 标准函数都根据当前事务的开始时间返回值:
... ...
CURRENT_TIMESTAMP

transaction_timestamp()等价于CURRENT_TIMESTAMP,但命名是为了清楚地反映它返回的内容。

now()是传统的 PostgreSQL 等价于transaction_timestamp().

大胆强调我的。CURRENT_TIMESTAMPtransaction_timestamp()now()正好相同。CURRENT_TIMESTAMP是函数的语法奇特,没有尾随括号对。这是根据 SQL 标准。

如果没有为 SQL 语句中的函数调用声明列别名,则别名默认为函数名。在内部,标准 SQLCURRENT_TIMESTAMP是用now(). 直到 Postgres 9.6 显示在结果列 name 中,它是“now”,但在 Postgres 10 中更改为“current_timestamp”。

transaction_timestamp() 做同样的事情,但这是一个合适的 Postgres 函数,所以默认别名一直是“transaction_timestamp”。

难道不是任意的这些混淆功能与特殊输入不变'now'。这只是特定日期/时间/时间戳值的几种符号简写之一,引用手册:

...读取时将转换为普通的日期/时间值。(特别是,now相关字符串一旦被读取就会被转换为特定的时间值。)当在 SQL 命令中用作常量时,所有这些值都需要用单引号括起来。

{[( )]}从这些特殊输入值中修剪出任意数量的前导和尾随空格和括号 ( )可能会增加混淆(至少到 Postgres 12)。所以'now()'::timestamptz- 或者只是'now()'在不需要显式类型转换的情况下 - 也是有效的,并且now() 在大多数情况下恰好与函数评估相同的时间戳。但这些是常量,通常不是您想要的列默认值。

db<>fiddle here
旧的sqlfiddle

值得注意的替代品是statement_timestamp()clock_timestamp()手册:

statement_timestamp()返回当前语句的开始时间(更具体地说,是从客户端接收到最新命令消息的时间)。[...]
clock_timestamp()返回实际的当前时间,因此即使在单个 SQL 命令中它的值也会发生变化。

注意:statement_timestamp()STABLE与上述(总是返回相同的SQL命令内的相同的值)。但clock_timestamp()必然只是VOLATILE。差异可能很大。

  • @santiagoarizti:不。`now()` 被定义为`STABLE`,因为它在同一事务中评估为相同的值(当前事务的开始时间)。我你的例子,`now()` 只执行一次*(而不是 [`clock_timestamp()`](http://www.postgresql.org/docs/current/interactive/functions-datetime.html#FUNCTIONS -DATETIME-CURRENT) 例如)。 (4认同)