Postgres日期发行

时间:2019-02-06 11:23:58

标签: sql postgresql postgresql-9.1

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

enter image description here

查询:

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') 

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

1 个答案:

答案 0 :(得分:4)

有关为什么的查询无效的解释:

to_date('01-12-2018', 'dd-mm-yyyy')创建一个日期值(即使您指定了时间部分),因此当您将其与时间戳进行比较时,就好像您正在将其与时间戳进行比较时,时间部分设置为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