Подтвердить что ты не робот

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

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

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

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

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

Спасибо

4b9b3361

Ответ 1

С датами (и временами) многие вещи становятся проще, если вы используете >= 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

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

Ответ 2

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

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

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

Ответ 3

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

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

Из документов:

BETWEEN SYMMETRIC - это то же самое, что и BETWEEN, за исключением того, что аргумент слева от AND не меньше или равен аргументу справа. Если это не так, эти два аргумента автоматически заменяются, поэтому всегда подразумевается непустой диапазон.

Ответ 4

WHERE table.date between '2018-12-05' and '2019-12-31' 

Ответ 5

Прочитайте документацию.

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.