我正在尝试从表中选择日期为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')
这种奇怪行为的原因是什么? 我必须在条件下以dd-mm-yyyy格式给出日期。
答案 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