一个简单的例子:
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
,因为我测试过对其他函数的调用被单引号正确转义。
我没有找到合理的解释,有人可以请一些建议吗?
答案 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
将是一个更好的选择。所以timestamptz
或now()
。详细说明:
您需要了解字符串文字或字符串常量与键入值之间的区别 Start in the manual here.