2015-06-17 54 views
0

我希望我的查詢具有動態日期。現在寫的方式,我必須每次都手動更改日期。請看下面的爲例:Postgres SQL - 如何創建動態日期變量

(select* 
from table2 
    where table2.begin_timestamp::date = '2015-04-01')as start 
left outer join 
(Select * 
from table 1 
    where opened_at::date >= ('2015-04-01' - 15) 
    and opened_at::date <= '2015-04-01’) 

我不想「2015-04-01」是硬編碼。我想反覆運行這個查詢來進行一系列日期。

+2

你如何選擇日期?看起來你只需要最近的15個日曆日。 – marceljg

+0

基本上我的查詢比這個要大得多:從表2中取出X並給我所有的產品購買。然後從表1中選擇購買日期最近15天內的所有數據。在查詢結束時,我應該可以說一個人在2015年4月1日購買了一輛汽車(表2),並且在進行購買後的15天內他測試了4個不同的日子(表1)驅車。但我想運行這個查詢在給定的時間窗口內的所有日期(比如4月份)我如何使日期變爲動態,所以我不必每次手動調整一天我運行它 – AmberLaw

+0

我假設我需要使用某種類型的循環函數,但我不確定如何。 - 任何幫助將不勝感激 – AmberLaw

回答

0

使用正常連接,你可以這樣做在on條款或where條款而不是子查詢。這導致邏輯是這樣的:

from (select* 
     from table2 
    ) start left outer join 
    table 1 
    on opened_at::date >= table2.begin_timestamp::date - interval '15 day' and 
     opened_at::date <= table2.begin_timestamp::date 
+0

嗨戈登 - 感謝您的答案,但我恐怕不是那麼容易。這個查詢是巨大的。我只是把我正在合作的一小段內容放在一起,以幫助恰當地描繪我的問題。 - 恐怕我需要某種類型的循環。我希望我可以創建一個日期變量,將循環通過給定的日期範圍。然後在我的查詢中,在日期出現的地方引用該變量。你有什麼想法如何做到這一點?我找不到解決此問題的任何內容。你的幫助非常感激。 – AmberLaw

0

我不是一個Postgres的開發者,但我覺得你能適應從所謂的「符合表」的SQL服務器領域的技術。

本質上,你的目標是加入第d天和最多15天的窗口。

您可以使用類似

SELECT * FROM generate_series('2015-04-01'::timestamp, 
           '2015-04-30 00:00', '1 days'); 

要生成日期序列,並從那裏你可以寫類似

select * 
from table a 
join generate_series('2015-04-01'::timestamp,'2015-04-30','1 days') s(o) 
    on a.begin_timestamp::date = s.o 
join table2 b 
    on a.opened_at>= b.begin_timestamp::date - interval '15 days' 
    and opened_at::date <= table2.begintimestamp::date 

本質,而不是循環使用一系列的日期間隔的開始和範圍的結束,以產生您之後的結果。