【问题标题】:Postgres date issuePostgres日期问题
【发布时间】:2019-02-06 11:23:57
【问题描述】:

我正在尝试从表中选择日期为 2018 年 12 月 1 日的记录。 即使有几条记录,postgres 也没有返回任何记录。

查询:

select * 
from dbo."Transactions" 
where "DateOfTransaction"::timestamp >=to_date('01-12-2018', 'dd-mm-yyyy') 
  and "DateOfTransaction"::timestamp <=to_date('01-12-2018', 'dd-mm-yyyy') 

我也试过了:

 select * 
 from dbo."Transactions" 
where "DateOfTransaction"::timestamp >=to_date('01-12-2018 00:00:00', 'dd-mm-yyyy HH24:MI:SS') 
  and "DateOfTransaction"::timestamp <=to_date('01-12-2018 23:59:59', 'dd-mm-yyyy HH24:MI:SS') 

这种奇怪行为的原因是什么? 我必须在 where 条件下以 dd-mm-yyyy 格式给出日期。

【问题讨论】:

  • 你真的应该避免那些可怕的引用标识符。它们造成的麻烦远远超过了它的价值。
  • 真的还在使用 Postgres 9.1 吗?那是no longer supported - 您现在应该计划升级到受支持的版本(例如 Postgres 11)。

标签: sql postgresql postgresql-9.1


【解决方案1】:

作为为什么您的查询不起作用的解释:

to_date('01-12-2018', 'dd-mm-yyyy') 创建一个 date 值(即使您指定了时间部分),因此当您将其与时间戳进行比较时,就好像您将其与时间的时间戳值进行比较部分设置为00:00:00

所以你的第一个查询基本上是一样的:

where "DateOfTransaction" >= timestamp '2018-12-01 00:00:00'
  and "DateOfTransaction" <= timestamp '2018-12-01 00:00:00'

这只会返回恰好包含2018-12-01 00:00:00的行


如何正确做?

您可以简单地将时间戳转换为日期并将其与 = 进行比较

where "DateOfTransaction"::date = date '2018-12-01'

无法在"DateOfTransaction" 上使用索引

如果您需要确保查询使用索引,您可以使用:

where "DateOfTransaction" >= DATE '2018-12-01'
  and "DateOfTransaction" < DATE '2018-12-01' + 1

请注意,转换 "DateOfTransaction"::timestamp 是无用的,因为该列已经是 timestamp

【讨论】:

  • 为什么where "DateOfTransaction" &gt;= DATE '2018-12-01' and "DateOfTransaction" &lt; DATE '2018-12-01' 不起作用?为什么我需要加1?即使我使用 >= 和
  • 因为在这两种情况下,时间部分都是00:00:00 - 请参阅下面的条件“这与”段落基本相同
  • 哦,我现在明白了。非常感谢。 Postgres 很奇怪。我的意思是,如果我包括时间部分,它应该考虑它。不应该吗?
  • @Arbaaz 如果您请求创建date,则不会。日期值没有时间部分。如果你想创建一个时间戳,你必须使用 to_timestamp() 或使用正确的 ISO 文字,就像我所做的那样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
  • 2019-10-15
  • 1970-01-01
  • 2011-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多