2015-11-06 3 views
0

Я пытаюсь создать 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 основные вещи, которые ошибка меня:

  1. Если я попытаюсь добавить ::tsrange непосредственно перед завершением запроса, интерпретатор жалуется, что:

    ОШИБКА: не может записывать запись типа в tsrange LINE 6: ... ROM past_week WHERE EXTRACT (DOW FROM day) = '4'))) :: tsrange;

  2. Я хотел бы избежать повторения, но я не владею SQL, чтобы знать, как это сделать. Любые улучшения более чем приветствуются.

ответ

2

Использование tsrange() constructor:

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 tsrange(
    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'))); 

        tsrange      
----------------------------------------------- 
["2015-10-29 00:00:00","2015-11-05 00:00:00") 
(1 row) 

Использование CURRENT_DATE запрос может быть столь же простым, как:

WITH previous_thursday AS (
    SELECT CURRENT_DATE- EXTRACT(DOW FROM CURRENT_DATE)::int+ 4 AS thursday 
    ) 
SELECT tsrange(thursday- '7d'::INTERVAL, thursday) 
FROM previous_thursday; 
+0

Это именно то, что я искал. Благодаря! Был бы также способ избежать написания дважды '(SELECT day FROM past_week WHERE EXTRACT (DOW FROM day) = '4')'? – Jir

+0

Да, см. Отредактированный ответ. – klin

Смежные вопросы