Postgres日期问题

Postgres date issue

我正在尝试 select 来自 table 的日期为 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 格式提供日期。

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

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'

这只会 return 行恰好包含 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