Sql 如何解释涉及当前_日期的insert语句的行为
我正在postgreSQL 8.2的分叉MPP版本上尝试一个非常简单的测试查询,并试图弄清楚这是否是预期的行为 当我使用当前日期为单行执行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 ;
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如何运行,该查询的结果显然是不正确的。