Запрос Postgresql между диапазонами дат
Я пытаюсь запросить мой postgresql db, чтобы возвращать результаты, где дата находится в определенном месяце и году. Другими словами, я бы хотел, чтобы все значения были за месяц-год.
Единственный способ, которым я смог это сделать, это вот так:
SELECT user_id
FROM user_logs
WHERE login_date BETWEEN '2014-02-01' AND '2014-02-28'
Проблема с этим в том, что я должен вычислить первую дату и последнюю дату перед запросом таблицы. Есть ли более простой способ сделать это?
Спасибо
Ответы
Ответ 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.