2014-12-30 66 views
0

我試圖抓取從今天的日期到14周前的所有記錄。我也需要同一周,但一年前。我有以下幾種:僅查詢日期範圍內使用postgresSQL的記錄(Redshift)

WHERE date(date) >= date(dateadd(week,-14, current_date)) 
OR date(date) >= date(dateadd(week,-52, current_date)) 
OR date(date) <= date(dateadd(week,-53, current_date)) 

它似乎沒有正常工作。

+1

「似乎沒有正常工作」是什麼意思?你有錯誤信息嗎?獲取錯誤的行? PostgreSQL本身不支持'dateadd()'等非標準日期函數。 Redshift? 「同一周但一年前」是什麼意思?同一日曆日,一年中的同一週數,同一個ISO周,還有其他情況? –

回答

0

你可以考慮使用INTERVALGETDATE()減去 - 它可能使事情變得更容易閱讀/原因有關,但DATEADD在理論上應工作(儘管它不是標準的Postgres - INTERVAL是) 。

從您聲明的要求與您的代碼中立即脫穎而出的一件事是,從布爾邏輯的角度來看,代碼與您的要求不符。

你說你需要從今天到14周之前的所有記錄,也是從一年前的同一周開始。

你的代碼,說的是:給我所有記錄的日期是在過去的14個星期內,日期是更大的超過52個星期前日期是小於53周前。

從純粹的布爾角度來看,你想要的東西更像是這樣的:

WHERE date(date) >= date(dateadd(week,-14, current_date)) 
    OR (date(date) >= date(dateadd(week,-52, current_date)) 
     AND date(date) <= date(dateadd(week,-53, current_date)) 
    ) 

注意額外的一組括號,並躋身組附加到and開關從or

此外,我想你可能也想,這組額外的括號內,扭轉>=<=,因爲在這種情況下,它表示較早日期較大的負數。這都將取決於到底如何DATEADD的作品,我不熟悉的,因爲我用的Postgres代替紅移紅移的Postgres 8.0的一個分支),但基於怎樣the Redshift doc似乎在說它的工作原理,我相信你確實希望他們逆轉。

所以後來就變成:

WHERE date(date) >= date(dateadd(week,-14, current_date)) 
    OR (date(date) <= date(dateadd(week,-52, current_date)) 
     AND date(date) >= date(dateadd(week,-53, current_date)) 
    ) 

這就是我的意思被它可能更容易使用INTERVAL時推理邏輯 - 用這些大的負偏差,而他們當然可以作出的工作,只是沒有那麼直觀的理由,國際海事組織。切換內部AND的兩側也是值得的,因此-53(較早的值)位於左側(不會更改功能,但可能會使此代碼中使用DATEADD更容易推理) 。

0

Amazon Redshift基於PostgreSQL 8.0。它不支持「間隔」數據類型,但文檔說它支持區間算術。我沒有看到任何暗示它支持dateadd(),但我可能錯過了它。

該查詢將按照當前版本的PostgreSQL和SQLFiddle上的測試和驗證方式工作。我認爲它不會像在Redshift上寫的那樣工作,但對你來說重要的部分只是WHERE子句。公用表表達式僅僅是給我們一個日曆來做間隔算術。在Redshift上你不需要它。

目前尚不清楚「同一周但一年前」的含義。你沒有提到任何特定的一週;你似乎對14周的時間感興趣。該查詢將從

  • 2014年9月23日(14周前)到情節中字(當前日期)返回行,並
  • 在2013年

    with calendar as (
    select (generate_series((current_date - interval '18 months'), current_date, '1 day'))::date cal_date 
    ) 
    select cal_date 
    from calendar 
    where cal_date between (current_date - interval '14 weeks')::date 
            and current_date 
        or cal_date between ((current_date - interval '1 year')::date - interval '14 weeks')::date 
            and (current_date - interval '1 year')::date 
    order by cal_date; 
    
同一日期
 
cal_date 
-- 
2013-09-23 
... 
2013-12-30 
2014-09-23 
... 
2014-12-30