如何解释这个涉及 current_date 的插入语句的行为

Posted

技术标签:

【中文标题】如何解释这个涉及 current_date 的插入语句的行为【英文标题】:How to explain the behavior of this insert statement involving current_date 【发布时间】:2013-08-20 04:05:02 【问题描述】:

我正在对 postgreSQL 8.2 的分叉 MPP 版本尝试一个非常简单的测试查询,我试图弄清楚这是否是预期的行为。

当我使用 current_date 为单行执行插入语句时,我得到了当前日期的预期输出:

create table test( t_date timestamp without time zone);

insert into test(  t_date)
VALUES
(
current_date::date
),


 db=> select * from test ;
           t_date        
    ---------------------
     2013-08-19 00:00:00
    (1 row)

但是当我在插入语句中添加多于一行时,我得到了一个意想不到的结果 - 这是标准的一部分吗?

insert into test(  t_date)
VALUES
(
current_date::date
),
(
current_date::date
);

   db=>  select * from test ;
           t_date        
    ---------------------
     1999-12-31 00:00:00
     1999-12-31 00:00:00
    (2 rows)

我的问题是:为什么当我使用 current_date::date 时第一个插入语句输出正确的日期,而当我使用相同的 current_date::date 转换时第二个插入输出两个不正确的日期?

【问题讨论】:

PostgreSQL 8.2.(什么)?在什么平台上?您正在使用一个非常古老且不受支持的版本。我在 9.2.4 上得到的结果正是你所期望的。 我正在开发一个名为 Greenplum 的 MPP 数据库,该数据库是从 Postgresql 分支出来的,所以我无法控制它已经过时的事实。我正在尝试确定这是我们所在平台中的错误还是真正的预期输出。 好吧,如果您提到这一点会有所帮助 - “我使用的是基于 PostgreSQL 8.2 的 Greenplum 4.2”。我已经更新了标签。 我可以在我们安装 Greenplum 4.2 时重现该问题。 【参考方案1】:

这个结果是不正确的、出乎意料的和奇怪的。

PostgreSQL 9.2.4 产生正确的结果。

regress=> select * from test;
       t_date        
---------------------
 2013-08-20 00:00:00
 2013-08-20 00:00:00
(2 rows)

as does 8.3, the oldest version I can be bothered testing.

无论您使用的 PostgreSQL 补丁/破解版本都引入了错误。

【讨论】:

谢谢,这很有帮助,我想唯一要做的就是在 8.2 上检查它,如果其他所有方法都失败,则提交 JIRA... @user7980 我会直接向 greenplum 提交一个错误。无论 8.2 的行为如何,该查询的结果都明显不正确。【参考方案2】:

是的,这是 Postgresql 的一个功能,允许使用 VALUES 子句进行“批量”加载。 http://www.postgresql.org/docs/8.2/static/sql-insert.html

请参阅以下部分:

使用多行 VALUES 语法插入多行:

【讨论】:

谢谢,但我仍然希望第二个插入语句的输出是 2013-08-19 00:00:00 就像第一个插入一样。您链接到的文档无法解决我的问题。 哦,我的回答完全没用,对不起。我不知何故完全跳过了你问题的相关部分。

以上是关于如何解释这个涉及 current_date 的插入语句的行为的主要内容,如果未能解决你的问题,请参考以下文章

如何使用列时间戳默认 current_date 创建 mysql 表?

如何使用 where < current_date sql?

BigQuery 结果中的 CURRENT_DATE 到昨天的日期

CURRENT_DATE/CURDATE() 不能作为默认 DATE 值工作

Oracle 时间戳和 current_date

知识盲点:存在外键的的表,在插入数据时应该如何操作?