Я пытаюсь создать tsrange
(последний четверг по четверг) в postgresql-запросе, но я получаю ошибки при запуске.Создание PostgreSQL `tsrange` из двух временных меток
Это то, что у меня есть до сих пор (начиная с this SO question).
WITH past_week AS (
SELECT date_trunc('day', NOW() + (s::TEXT || ' day')::INTERVAL)::TIMESTAMP(0) AS day
FROM generate_series(-7, 0, 1) AS s)
SELECT (
date_trunc('day', (SELECT day FROM past_week WHERE EXTRACT(DOW FROM day) = '4') - '7 day'::INTERVAL),
date_trunc('day', (SELECT day FROM past_week WHERE EXTRACT(DOW FROM day) = '4')));
И это результат (правильное значение, но не формат, так как это не диапазон):
row
-----------------------------------------------
("2015-10-29 00:00:00","2015-11-05 00:00:00")
(1 row)
Теперь есть 2 основные вещи, которые ошибка меня:
Если я попытаюсь добавить
::tsrange
непосредственно перед завершением запроса, интерпретатор жалуется, что:ОШИБКА: не может записывать запись типа в tsrange LINE 6: ... ROM past_week WHERE EXTRACT (DOW FROM day) = '4'))) :: tsrange;
Я хотел бы избежать повторения, но я не владею SQL, чтобы знать, как это сделать. Любые улучшения более чем приветствуются.
Это именно то, что я искал. Благодаря! Был бы также способ избежать написания дважды '(SELECT day FROM past_week WHERE EXTRACT (DOW FROM day) = '4')'? – Jir
Да, см. Отредактированный ответ. – klin