now()和current_timestamp之间的区别


45

在PostgreSQL中,我使用now()and current_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)

我想念什么吗?

Answers:


54

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

1)

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

2)

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

3)

now()是与PostgreSQL等效的传统PostgreSQL transaction_timestamp()

大胆强调我的。CURRENT_TIMESTAMPtransaction_timestamp()并且now()做的完全一样。CURRENT_TIMESTAMP是函数的句法奇数,没有尾随括号。那是根据SQL标准。

如果您没有在SQL语句中为函数调用声明列别名,则别名默认为该函数的名称。在内部,标准SQL CURRENT_TIMESTAMP是通过实现的now()。直到显示在结果列名称中的Postgres 9.6为止,该名称为“ now”,但在Postgres 10中更改为“ current_timestamp”。

transaction_timestamp() 这样做是一样的,但是这是一个适当的Postgres函数,因此默认别名始终为“ transaction_timestamp”。

难道不是任意的这些混淆功能与特殊输入不变'now'引用具体的日期/时间/时间戳记值,这只是几种记号速记之一。

...读取时将转换为普通的日期/时间值。(特别是,now相关的字符串在读取后立即转换为特定的时间值。)当在SQL命令中用作常量时,所有这些值都必须用单引号引起来。

可能会混淆(至少到Postgres 12){[( )]}从这些特殊输入值中修剪掉任意数量的前,后空格和方括号()。因此'now()'::timestamptz-或仅'now()'在不需要显式类型强制转换的情况下-也是有效的,并且now() 在大多数情况下碰巧以与函数相同的时间戳进行计算。但是这些是常量,例如通常不是您想要的列默认值。

db <> 在这里拨弄
旧的SQL拨弄

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

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

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


但是,这对查询优化有影响吗?:现在()中的每一行执行where items.createddate > now()
圣地亚哥·亚利桑那州,

3
@santiagoarizti:now()之所以定义编号,是STABLE因为它在同一笔交易中得出的值相同(当前交易的开始时间)。在您的示例中,now()仅执行一次(而不是clock_timestamp()例如)。
Erwin Brandstetter

3

除了在正确使用它们时在功能上没有区别外,它们的投射方式也不同:

'now()'重新确认(就像'today''now'):

b=# select 'now()'::timestamptz;
          timestamptz
-------------------------------
 2016-12-09 16:31:35.942243+00
(1 row)

'CURRENT_TIMESTAMP'从黑暗边缘给出有趣的错误

注意:从PostgreSQL 7.2版本开始,不再支持'current'作为日期/时间常数

b=# select 'CURRENT_TIMESTAMP'::timestamptz;
ERROR:  date/time value "current" is no longer supported
LINE 1: select 'CURRENT_TIMESTAMP'::timestamptz;
               ^

并且'transaction_timestamp()'只是未将其识别为带有tz值的时间戳:

b=# select 'transaction_timestamp()'::timestamptz;
ERROR:  invalid input syntax for type timestamp with time zone: "transaction_timestamp()"
LINE 1: select 'transaction_timestamp()'::timestamptz;
               ^

请不要问你为什么投'now()' as timestamp。我已经看到where timestamp_column = 'now()'而不是where timestamp_column = now()在人员代码中看到了,所以认为这种澄清将是一个有趣的事实,并且是对Erwin的回答的有益补充。


这是一个误会。该输入字符串'now()'看起来类似功能now()的表面上,但没有直接关系,否则。'now'是不断评估当前交易的开始时间。尾部括号被忽略。尝试将字符串'CURRENT_TIMESTAMP''transaction_timestamp()'timestamp类似方式转换为失败,因为这只是胡说八道。两者均与相应功能无关。
Erwin Brandstetter
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.