Answers:
没有区别。手册中的三句话:
1)
这些SQL标准函数都基于当前事务的开始时间返回值:
... ...
CURRENT_TIMESTAMP
2)
transaction_timestamp()
等价于CURRENT_TIMESTAMP
,但命名为清楚地反映其返回的内容。
3)
now()
是与PostgreSQL等效的传统PostgreSQLtransaction_timestamp()
。
大胆强调我的。CURRENT_TIMESTAMP
,transaction_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()
在大多数情况下碰巧以与函数相同的时间戳进行计算。但是这些是常量,例如通常不是您想要的列默认值。
值得注意的替代品statement_timestamp()
和clock_timestamp()
。手册:
statement_timestamp()
返回当前语句的开始时间(更具体地说,是从客户端收到最新命令消息的时间)。[...]
clock_timestamp()
返回实际的当前时间,因此,即使在单个SQL命令中,其值也会更改。
注意:statement_timestamp()
是STABLE
与上述(总是返回相同的SQL命令内的相同的值)。但clock_timestamp()
必然只是VOLATILE
。差异可能很大。
now()
之所以定义编号,是STABLE
因为它在同一笔交易中得出的值相同(当前交易的开始时间)。在您的示例中,now()
仅执行一次(而不是clock_timestamp()
例如)。
除了在正确使用它们时在功能上没有区别外,它们的投射方式也不同:
'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
类似方式转换为失败,因为这只是胡说八道。两者均与相应功能无关。
where items.createddate > now()
?