Я столкнулся со странным сценарием при сравнении дат в postgresql (версия 9.2.4 в windows). В моей таблице есть столбец с именем update_date с типом «отметка времени без часового пояса». Клиент может выполнять поиск в этом поле только с датой (например, 2013-05-03) или датой со временем (например, 2013-05-03 12:20:00). Этот столбец имеет значение как метка времени для всех строк в настоящее время и имеет ту же часть даты (2013-05-03), но разницу во времени.
Когда я сравниваю этот столбец, я получаю разные результаты. Как следующие:
select * from table where update_date >= '2013-05-03' AND update_date <= '2013-05-03' -> No results
select * from table where update_date >= '2013-05-03' AND update_date < '2013-05-03' -> No results
select * from table where update_date >= '2013-05-03' AND update_date <= '2013-05-04' -> results found
select * from table where update_date >= '2013-05-03' -> results found
Мой вопрос: как я могу сделать первый запрос возможным, чтобы получить результаты, я имею в виду, почему третий запрос работает, но не первый?
Кто-нибудь может мне помочь с этим? Заранее спасибо.
источник
'2013-05-03'::date
и'1 day'::interval
) специфичен для PostgreSQL?CAST('2013-05-03' AS DATE) + CAST('1 day' AS INTERVAL)
(IIRC). YMMV о существовании и поведенииDATE
иINTERVAL
.::DATE
добавить к первой части предложенияWHERE update_date::date = '2013-05-03'
работать, а может быть, немного более читабельным?update_date
былоtimestamp without timezone
. я предположил индекс по этому столбцу. ваш предикат не будет использовать этот индекс.При сравнении
update_date >= '2013-05-03'
postgres приводит значения к одному типу для сравнения значений. Итак, ваш «2013-05-03» был приведен к «2013-05-03 00:00:00».Так что для update_date = '2013-05-03 14:45:00' ваше выражение будет таким:
Это всегда
false
Чтобы решить эту проблему, приведите update_date к
date
:источник
update_date
в таблице к приведению одного значения параметра запроса ужасно неэффективно и гарантирует, что сервер не сможет использовать индексы для этого столбца. я склонен -1 это.SELECT * FROM my_table WHERE update_date >= '2013-05-03' AND update_date < '2013-05-04';
(Обратите внимание на использование 4 мая а не 3-й и с МЕНЬШЕ ЗНАКА, а не меньше или равно.)Используйте
range
тип. Если пользователь вводит дату:Если пользователь вводит метки времени, то вам не нужна
::date + 1
частьhttp://www.postgresql.org/docs/9.2/static/rangetypes.html
http://www.postgresql.org/docs/9.2/static/functions-range.html
источник
Использовать преобразование даты для сравнения с датой: Попробуйте это:
источник