为什么' now()' :: timestamp会返回PostgreSQL中的当前时间戳?

时间:2016-03-12 00:12:49

标签: postgresql types casting timestamp

一个简单的例子:

select 'now()'::timestamp;

给出

2016-03-12 07:52:46.1

请注意now()函数调用的单引号。

我认为now()函数调用由单引号转义,数据库应仅输出now()。但是我在Postgres 9.0和8.4上对此进行了测试,结果都是2016-03-12 07:52:46.1

当我明确地将'now()'(注意单引号)插入timestamp类型的字段时,会发生同样的事情。

但是如果没有适用于timestamp的隐式转换,它只会输出'now()',例如:

select 'now()';

给出:

now()

我注意到这样的' unescaping'只发生在now,因为我测试过对其他函数的调用被单引号正确转义。

我没有找到合理的解释,有人可以请一些建议吗?

2 个答案:

答案 0 :(得分:2)

它是conversion from string to timestamp or date/time type的特殊功能;括号是多余的,因为它不是真正的函数调用。我非常怀疑添加了该特定值是为了作为timestamp列的特殊默认值。

答案 1 :(得分:1)

'now()'::timestamp'now'::timestamp完全相同,并且函数调用{{与不同 1}}。

Details in the current manual.特别注意这些字符串......

  

...只是将被转换为的符号短语   读取时的普通日期/时间值。 (特别是now()和相关的   读取后,字符串将被转换为特定的时间值。)

通常,你 想要将字符串用作列默认值,这将导致一个常量表示命令执行的时刻(“早期”捆绑”)。使用now或标准SQL函数now()::timestamp获取当前本地时间(动态 - “后期绑定”)。

在大多数情况下,LOCALTIMESTAMP将是一个更好的选择。所以timestamptznow()。详细说明:

您需要了解字符串文字或字符串常量与键入值之间的区别 Start in the manual here.