Дата выпуска Postgres - PullRequest
       9

Дата выпуска Postgres

0 голосов
/ 06 февраля 2019

Я пытаюсь выбрать из таблицы записи от 1 декабря 2018 года.Хотя есть несколько записей, которые 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') 

В чем причина этого странного поведения?Я должен дать дату в формате дд-мм-гггг, где условие.

1 Ответ

0 голосов
/ 06 февраля 2019

В качестве объяснения по , почему ваш запрос не работает:

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

...