你可以考慮使用INTERVAL
從GETDATE()
減去 - 它可能使事情變得更容易閱讀/原因有關,但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
更容易推理) 。
「似乎沒有正常工作」是什麼意思?你有錯誤信息嗎?獲取錯誤的行? PostgreSQL本身不支持'dateadd()'等非標準日期函數。 Redshift? 「同一周但一年前」是什麼意思?同一日曆日,一年中的同一週數,同一個ISO周,還有其他情況? –