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_TIMESTAMP
,transaction_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
。差异可能很大。#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
评论
但是,这对查询优化有影响吗?将对以下各行执行now():where items.createddate> now()吗?
–圣地亚哥·亚利桑那
17年2月21日在0:20
@santiagoarizti:否,now()定义为STABLE,是因为它在同一笔交易中计算得出的值相同(当前交易的开始时间)。在您的示例中,now()仅执行一次(例如,与clock_timestamp()相反)。
–欧文·布兰德斯特(Erwin Brandstetter)
17年2月21日在9:26