Запрос Postgresql между диапазонами дат

Я пытаюсь запросить мою БД postgresql, чтобы вернуть результаты, где дата находится в определенном месяце и Году. Другими словами, Я хотел бы получить все значения за месяц-год.

единственный способ, которым я смог сделать это до сих пор, таков:

SELECT user_id 
FROM user_logs 
WHERE login_date BETWEEN '2014-02-01' AND '2014-02-28'

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

спасибо

4 ответов


С даты (и время) многие вещи становятся проще, если вы используете >= start AND < end.

например:

SELECT
  user_id
FROM
  user_logs
WHERE
      login_date >= '2014-02-01'
  AND login_date <  '2014-03-01'

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

дата окончания также упрощена; просто добавьте ровно один месяц. Не связывайтесь с 28-м, 30-м, 31-м и т. д.


эта структура также имеет преимущество мочь к поддерживать использование индексов.


многие люди могут предложить такую форму, как следующая, но они не использовать индексы:

WHERE
      DATEPART('year',  login_date) = 2014
  AND DATEPART('month', login_date) = 2

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


Из PostreSQL 9.2 Типа поддерживаются. Поэтому вы можете написать это так:

SELECT user_id
FROM user_logs
WHERE '[2014-02-01, 2014-03-01]'::daterange @> login_date

это должно быть более эффективным, чем сравнение строк


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

SELECT user_id 
FROM user_logs 
WHERE login_date BETWEEN SYMMETRIC '2014-02-01' AND '2014-02-28'

документы:

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


читать документацию.

http://www.postgresql.org/docs/9.1/static/functions-datetime.html

я использовал такой запрос:

WHERE
(
    date_trunc('day',table1.date_eval) = '2015-02-09'
)

или

WHERE(date_trunc('day',table1.date_eval) >='2015-02-09'AND date_trunc('day',table1.date_eval) <'2015-02-09')    

Juanitos Ingenier.