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


我缺少什么吗?

#1 楼

没有区别。手册中的三引号:

1)


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


2)


transaction_timestamp()等同于CURRENT_TIMESTAMP,但<



3)


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


强调粗体。 CURRENT_TIMESTAMPtransaction_timestamp()now()完全相同。 CURRENT_TIMESTAMP是函数的语法奇数,没有尾随括号。

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

transaction_timestamp()的功能相同,但这是一个正确的Postgres函数,因此默认别名始终为“ transaction_timestamp”。

不要将这两个函数与特殊输入常量'now'混淆。那只是特定日期/时间/时间戳值的几种记号速记方式之一,引用了手册:


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


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


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


注意:statement_timestamp()与上述的clock_timestamp()一样(始终在相同的SQL命令中返回相同的值)。但是statement_timestamp()一定只是STABLE。差异可能很大。

评论


但是,这对查询优化有影响吗?将对以下各行执行now():where items.createddate> now()吗?

–圣地亚哥·亚利桑那
17年2月21日在0:20

@santiagoarizti:否,now()定义为STABLE,是因为它在同一笔交易中计算得出的值相同(当前交易的开始时间)。在您的示例中,now()仅执行一次(例如,与clock_timestamp()相反)。

–欧文·布兰德斯特(Erwin Brandstetter)
17年2月21日在9:26

#2 楼

除了它们在正确使用它们时没有功能上的差异之外,它们的投射方式也不同:
'now()'从黑暗边缘产生有趣的错误


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

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


'today'只是不被认可为带有tz值的时间戳:不问你为什么要投'now'。我已经在人员代码中看到了'CURRENT_TIMESTAMP'而不是'transaction_timestamp()',因此认为这一澄清将是一个有趣的事实,也是对Erwin答案的有益补充。

评论


这是一个误会。输入字符串'now()'看起来与表面上的now()函数相似,但与其他函数没有直接关系。 “现在”是对当前交易开始时间的持续评估。尾部括号被忽略。以类似方式将字符串“ CURRENT_TIMESTAMP”或“ transaction_timestamp()”转换为时间戳的尝试失败,因为这只是胡说。两者均与相应功能无关。

–欧文·布兰德斯特(Erwin Brandstetter)
18-2-2在2:04



与其他答案相反,此答案令人困惑,尤其是引号。

–丹尼尔·W。
20-3-12在16:05