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格式)
with
select*
返回:

<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) &gt;= 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