Joh*_*ino 69 postgresql timestamp
在 PostgreSQL 中,我使用now()andcurrent_timestamp函数,我看不出有什么区别:
# SELECT now(), current_timestamp;
now | now
--------------------------------+--------------------------------
04/20/2014 19:44:27.215557 EDT | 04/20/2014 19:44:27.215557 EDT
(1 row)
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?
Erw*_*ter 91
有没有什么区别。手册中的三句话:
1)
这些 SQL 标准函数都根据当前事务的开始时间返回值:
... ...
CURRENT_TIMESTAMP
transaction_timestamp()等价于CURRENT_TIMESTAMP,但命名是为了清楚地反映它返回的内容。
now()是传统的 PostgreSQL 等价于transaction_timestamp().
大胆强调我的。CURRENT_TIMESTAMP,transaction_timestamp()并now()做正好相同。CURRENT_TIMESTAMP是函数的语法奇特,没有尾随括号对。这是根据 SQL 标准。
如果没有为 SQL 语句中的函数调用声明列别名,则别名默认为函数名。在内部,标准 SQLCURRENT_TIMESTAMP是用now(). 直到 Postgres 9.6 显示在结果列 name 中,它是“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。差异可能很大。
| 归档时间: |
|
| 查看次数: |
68528 次 |
| 最近记录: |