2015-11-06 182 views
0

我想在postgresql查詢中創建一個tsrange(上個星期四到上一個星期四),但我得到了轉換錯誤。從兩個時間戳創建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) 

現在,有兩個主要的事情來煩我:

  1. 如果我在查詢結束前嘗試添加::tsrange,解釋器會抱怨:

    錯誤:不能投入類型記錄tsiling 線6:... ROM past_week提取(DOW從一天)='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