Интервал от начала недели PostgreSQL
PostgreSQL. Имеется следующее условие:
WHERE datedecision BETWEEN date_trunc('day', CAST(${dateFrom} as timestamp)) AND date_trunc('day',CAST(${dateFrom} as timestamp) + INTERVAL '1 day') )
${dateFrom} - выбираемая пользователем дата во внешней системе.
На данный момент это позволяет фильтровать значения за один выбранный день (например, с 26.04.2021 00:00:00 по 27.04.2021 00:00:00).
Необходимо изменить условие так, чтобы значения фильтровались от понедельника предшествущего выбранной дате по выбранную дату. (Например, ${dateFrom} = 15.04.2021, тогда фильтрация должна быть с 12.04.2021 по 15.04.2021 включительно). Возможно ли такое реализовать? Заранее спасибо.
Ответы (2 шт):
Решение нашлось:
WITH chdate AS
(SELECT EXTRACT(ISODOW FROM TIMESTAMP ${dateFrom})::INT AS ddays)
Затем используем полученное значение
WHERE datedecision BETWEEN date_trunc('day', CAST(${dateFrom} as timestamp) - ddays + 1) AND date_trunc('day',CAST(${dateFrom} as timestamp))
CTE? Зачем? На старых версиях postgresql только планировщик путать будете. Простого date_trunc достаточно:
datedecision >= date_trunc('week', timestamp '2021-04-15')
and datedecision < timestamp '2021-04-15' + interval '1 day'
Обратите внимание, что between подразумевает <= в условии, т.е. 2021-04-16 00:00:00.000 входит в интервал. Обычно в подобных задачах подразумевается такие даты уже не включать в фильтр.