PostgreSQL МЕЖДУ оператором ведет себя по-разному - PullRequest
3 голосов
/ 12 июня 2019

Я использовал SQL-запрос для извлечения данных за пару дней развернутого решения

И я использовал запрос следующим образом

select column1, column2, column3, column 4 
where <condition 1> AND <condition 2> AND 
      created_timestamp BETWEEN '05-31-2019' AND '06-11-2019'

Теперь он использовался для получениязначения всех столбцов и фильтрует данные по условиям, как ожидалось, за исключением того, что здесь был один поворот.Это не выборка данных за дату 11 th июня, которая указана в качестве верхнего предела.

Теперь, насколько мне известно, между оператором включены обе конечные точки диапазона, который предоставляется..

Что меня больше смутило, так это то, что оно каким-то образом включало данные за дату 31 st мая, которая является верхним пределом.

  1. Мне нужно знать, включает ли конечный пункт диапазона оператор (особенно в postgresql, не думаю, что он изменится, просто хочет подтвердить)?

  2. Даже если он включает /исключает, что он должен вести себя одинаково для обеих конечных точек. Я не понимаю предвзятого поведения кого-либо, кто имеет ключ к этому?

Ответы [ 4 ]

4 голосов
/ 12 июня 2019

Попробуйте использовать правильные литералы даты:

SELECT column1, column2, column3, column4
FROM your_table
WHERE created_timestamp BETWEEN '2019-05-31' AND '2019-06-11';

2019-05-31 в формате ISO 8601 и однозначно означает 31 мая 2019 в любом режиме.

Вы можете узнать больше о правилах для типов даты / времени здесь .

Edit:

Причина, по которой данные за 11 июня не отображаются, заключается в том, что использование 2011-06-11 в качестве верхней границы диапазона совпадает с использованием 2011-06-11 00:00:00. То есть включает только 11 июня ровно в полночь. Чтобы смягчить это, используйте 12 июня в качестве верхней границы:

SELECT column1, column2, column3, column4
FROM your_table
WHERE created_timestamp >= '2019-05-31' AND created_timestamp < '2019-06-12';
1 голос
/ 12 июня 2019

Я предполагаю, что created_timestamp - это timestamp (с часовым поясом или без него).

Литерал, который вы использовали, 06-11-2019, соответствует полуночи этой даты:

SELECT '06-11-2019'::timestamp with time zone;
      timestamptz       
------------------------
 2019-06-11 00:00:00+02
(1 row)

Так что неудивительно, что результаты не включают данные за 11 июня.

Есть два пути вперед:

  1. Используйте следующий день и оператор <:

    ... WHERE created_timestamp >= '05-31-2019' AND created_timestamp < '06-12-2019'
    
  2. преобразовать метку времени в date:

    ... WHERE date(created_timestamp) BETWEEN '05-31-2019' AND '06-11-2019'
    

Второй параметр не может использовать индекс для created_timestamp (но он может использовать индекс для date(created_timestamp)).

Ваш запрос зависит от параметра PostgreSQL, равного DateStyle, поэтому убедитесь, что этот параметр всегда соответствует требуемому.

1 голос
/ 12 июня 2019

Если create_timestamp является значением даты / времени, а не просто датой, тогда все 11 июня после полуночи (00:00 часов) будет вне МЕЖДУ.Так что вы можете сделать это, может быть

date_trunc('day', created_timestamp) BETWEEN '2019-05-31' AND '2019-06-11'

Как уже указывалось, даты должны быть в формате гггг-мм-дд.Как сказал Гордон, в этом случае их не нужно приводить на сегодняшний день, но он прав в том, что в некоторых ситуациях вам нужно выполнять приведение на сегодняшний день, и это не помешает.

0 голосов
/ 12 июня 2019

Предположительно, created_timestamp на самом деле в формате даты / времени. Итак, сравните значения даты / времени, а не строки:

created_timestamp >= '2019-05-21'::date and
created_timestamp < '2019-06-11'::date

Обратите внимание, что я изменил between на два неравенства. Это означает, что коды ведут себя так, как ожидается, когда created_timestamp фактически имеет компонент времени.

...