Postgresql 时间戳列上的日期\u trunc不返回任何内容
在将截断字段与Postgresql 时间戳列上的日期\u trunc不返回任何内容,postgresql,postgresql-9.1,Postgresql,Postgresql 9.1,在将截断字段与date\u trunc()进行比较后,从数据库检索记录时,我遇到了一个奇怪的问题 此查询不返回任何数据: select id from my_db_log where date_trunc('day',creation_date) >= to_date('2014-03-05'::text,'yyyy-mm-dd'); 但是,如果我用id添加列creation\u date,它将返回数据(即select id,creation\u date…) 我有另一列last\u
date\u trunc()
进行比较后,从数据库检索记录时,我遇到了一个奇怪的问题
此查询不返回任何数据:
select id from my_db_log
where date_trunc('day',creation_date) >= to_date('2014-03-05'::text,'yyyy-mm-dd');
但是,如果我用id
添加列creation\u date
,它将返回数据(即select id,creation\u date…
)
我有另一列last\u update\u date
具有相同的类型,当我使用该列时,仍然执行相同的行为
select id from my_db_log
where date_trunc('day',last_update_date) >= to_date('2014-03-05'::text,'yyyy-mm-dd');
与前一个类似。如果我在我的选择中选择了id、上次更新日期,它还会返回记录
现在为了进一步挖掘,我在我的where
子句中添加了creation\u date
和last\u updated\u date
,这一次它要求在我的select
子句中同时添加这两个属性,以便有记录(即select id,creation\u date,last\u update\u date
)
有人遇到过同样的问题吗?类似的事情也适用于我的其他表,这些表都有这种类型的列
如果有帮助,以下是我的表模式:
id serial NOT NULL,
creation_date timestamp without time zone NOT NULL DEFAULT now(),
last_update_date timestamp without time zone NOT NULL DEFAULT now(),
CONSTRAINT db_log_pkey PRIMARY KEY (id),
我之前问了一个不同的问题,但没有得到任何答案。这个问题可能与那个问题有关。如果你对这个感兴趣,这里是
编辑::EXPLAIN(XML格式)
withselect*
返回:
<explain xmlns="http://www.postgresql.org/2009/explain">
<Query>
<Plan>
<Node-Type>Result</Node-Type>
<Startup-Cost>0.00</Startup-Cost>
<Total-Cost>0.00</Total-Cost>
<Plan-Rows>1000</Plan-Rows>
<Plan-Width>658</Plan-Width>
<Plans>
<Plan>
<Node-Type>Result</Node-Type>
<Parent-Relationship>Outer</Parent-Relationship>
<Alias>my_db_log</Alias>
<Startup-Cost>0.00</Startup-Cost>
<Total-Cost>0.00</Total-Cost>
<Plan-Rows>1000</Plan-Rows>
<Plan-Width>658</Plan-Width>
<Node/s>datanode1</Node/s>
<Coordinator-quals>(date_trunc('day'::text, creation_date) >= to_date('2014-03-05'::text, 'yyyy-mm-dd'::text))</Coordinator-quals>
</Plan>
</Plans>
</Plan>
</Query>
</explain>
结果
0
0
1000
658
结果
外面的
我的数据库日志
0
0
1000
658
数据节点1
(日期('day':文本,创建日期)=截止日期('2014-03-05':文本,'yyyy-mm-dd':文本))
“不可能”现象
返回的行数完全独立于SELECT
子句中的项目。(但请参见@Craig对SRF的评论。)您的数据库中一定有问题。
也许是一个破损的覆盖指数?当您加入附加列时,您将强制Postgres访问表本身。尝试重新索引:
REINDEX TABLE my_db_log;
这本手册是关于。或:
更好的查询
无论哪种方式,请改用:
select id from my_db_log
where creation_date >= '2014-03-05'::date
或:
'2014-03-05'
采用ISO 8601格式。您可以将此字符串文本转换为date
。不需要to_date()
,可用于任何语言环境。与创建日期相比,日期
自动强制为时间戳[无时区]
(即时间戳[无时区]
)。有关Postgres中时间戳的更多详细信息,请参见此处:
此外,在这里输入date\u trunc()
也没有任何好处。相反,查询速度会变慢,并且无法使用列上的任何普通索引(这可能会使查询速度变慢)“返回的行数完全独立于SELECT子句中的项目”。除非在SELECT
列表中有一个set返回函数,否则在这种情况下,PostgreSQL在FROM中关于srf的奇怪、有时甚至疯狂的行为就开始起作用了。这里的情况似乎不是这样,但总的来说值得考虑。@Erwin我尝试了您建议的REINDEX
和VACUUM
,但仍然不起作用。但你是对的,我的数据库出了点问题。不过,您建议的更好的查询正在运行,我们欠您一个+1
。@SabujHassan:一个完整的转储/恢复周期可能会修复您可能损坏的数据库。还原到新的数据库群集以确保…@ErwinBrandstetter是的还原工作正常。这是一个奇怪的问题!请为两个查询显示EXPLAIN
。@CraigRinger我已将EXPLAIN
与问题一起添加。请完整、未编辑EXPLAIN
且无参数。需要看看这些计划是否相同。@CraigRinger上一个计划是JSON
,我刚刚从那里删除了{[
。为Select*
添加了XML
一个。啊,为什么?没有参数有什么困难?没关系,算了吧。
select id from my_db_log
where creation_date >= '2014-03-05'::date
select id from my_db_log
where creation_date >= '2014-03-05 00:00'::timestamp