【问题标题】:Why does 'now()'::timestamp return the current timestamp in PostgreSQL?为什么 'now()'::timestamp 返回 PostgreSQL 中的当前时间戳?
【发布时间】:2016-06-27 09:35:54
【问题描述】:

一个简单的例子:

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

我注意到这种“取消转义”只发生在 now 上,因为我测试了对其他函数的调用正确地被单引号转义。

我没能找到合理的解释,谁能给点建议?

【问题讨论】:

  • 有趣。你能在文本列和select the_text::timestamp from the_table 中插入“now()”吗?

标签: postgresql types casting timestamp


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    'now()'::timestamp'now'::timestamp 完全相同,并且与函数 调用now() 略有不同。 p>

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

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

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

    在大多数情况下,timestamptz 是一个更好的选择。所以now()CURRENT_TIMESTAMP。详情:

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

    【讨论】:

      猜你喜欢
      • 2019-05-01
      • 2019-05-02
      • 2012-11-25
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2011-02-02
      • 2013-06-09
      • 2011-05-08
      相关资源
      最近更新 更多