如何解释涉及current_date的此insert语句的行为

时间:2013-08-20 04:05:02

标签: sql postgresql greenplum

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

当我使用current_date为单行执行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)
  

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

2 个答案:

答案 0 :(得分:2)

结果不正确,出乎意料,而且奇怪。

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的修补/黑客攻击版本都引入了一个错误。

答案 1 :(得分:0)

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

请参阅以下部分:

  

使用multirow VALUES语法插入多行: