Sql 如何解释涉及当前_日期的insert语句的行为

Sql 如何解释涉及当前_日期的insert语句的行为,sql,postgresql,greenplum,Sql,Postgresql,Greenplum,我正在postgreSQL 8.2的分叉MPP版本上尝试一个非常简单的测试查询,并试图弄清楚这是否是预期的行为 当我使用当前日期为单行执行insert语句时,我得到当前日期的预期输出: create table test( t_date timestamp without time zone); insert into test( t_date) VALUES ( current_date::date ), db=> select * from test ;

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

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

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语句添加多行时,我得到了一个意外的结果——这是标准的一部分吗

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)
我的问题是:为什么第一个insert语句在我使用current_date::date时输出正确的日期,而第二个insert语句在我使用同一current_date::date cast时输出两个错误的日期


是的,这是Postgresql的一个特性,允许使用VALUES子句进行“批量”加载。

见以下章节:

要使用“多行值”语法插入多行,请执行以下操作:


这一结果是错误的、出乎意料的和离奇的

PostgreSQL 9.2.4生成正确的结果

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


无论您使用的PostgreSQL的哪个补丁/黑客版本都引入了一个bug。

谢谢,但我仍然希望第二条insert语句的输出与第一条insert语句的输出一样是2013-08-19 00:00:00。你链接到的文档无法解决我的问题。哦,我的回答完全没有用,对不起。不知何故,我完全跳过了你问题的相关部分。PostgreSQL 8.2。(什么)?在哪个站台?您使用的是一个非常古老且不受支持的版本。我在9.2.4上得到的结果正是你所期望的。我正在处理一个名为Greenplum的MPP数据库,它是从Postgresql派生出来的,所以我无法控制它是旧的这一事实。我试图确定这是我们所处的平台中的一个bug还是真正的预期输出。如果您提到“我使用的是基于PostgreSQL 8.2的Greenplum 4.2”,这会有所帮助。我已经更新了标签。我可以在我们安装的Greenplum 4.2上重现这个问题。谢谢,这非常有帮助。我想唯一要做的就是在8.2上检查它,然后在所有其他方面都失败的情况下提交JIRA…@user7980我会直接向Greenplum提交一个bug。无论8.2如何运行,该查询的结果显然是不正确的。