如何解释这个涉及 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 到昨天的日期