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()?