2013-01-08 50 views
1

這是我的查詢的一部分:MySQL WEEK() - 我還必須比較YEARs嗎?

WHERE WEEK(data.time) = (WEEK(CURRENT_DATE + INTERVAL -3 WEEK)) 

我可以選擇從三個星期前的數據,這意味着2012年12月 現在的問題是 - 我得到的數據是本週所有年份。不僅僅是三週前的那個。

加入

YEAR(data.time) = YEAR(CURRENT_DATE + INTERVAL -3 WEEK) 

問題解決了,但我不知道是否有必要也比較年,如果我能留在只有一週比較 - 如果我以某種方式調整的第一行。

我發現類似的查詢在這裏 MySQL week numbers and New Year 但他們不提年這樣的問題,現在看來,這爲他們工作,即使沒有一年的比較。

+0

您在示例中使用了兩個不同的*日期,data.time和report.cas_zaciatok。他們有什麼關係? – kmkaplan

+0

對不起,他們應該是一樣的,我只是複製錯了:) –

回答

2

通過與所需的一週的開始和結束比較,您會得到更好的服務。喜歡的東西:

WHERE SUBDATE(CURDATE(), WEEKDAY(CURDATE()) + 21) <= data.time 
    AND data.time < SUBDATE(CURDATE(), WEEKDAY(CURDATE()) + 14); 

使本年度的第一個和最後一個星期的差異。例如2012-12-31是2013-W01的一部分(的第一週)。所以WEEK會說1,而YEAR會說2012。而2013-01-13,2013-W01 WEEK的一部分爲1YEAR2013。如此天真的使用WEEKYEAR這會給你錯誤的結果。

+0

這是一個好點。我知道在這種情況下比較幾年有什麼問題:)我不知道有關subdate,會嘗試你的建議。 –

+0

@OriesokVlassky'SUBDATE'減去日期的某些日子。 – kmkaplan

+0

+1,不錯,但是使用NOW()和BETWEEN可以在一週結束時產生一些有趣的效果。 (截止時間取決於一天中的時間,並且星期也會稍微重疊,因爲「BETWEEN」包含在內。)最好使用'date.time> = SUBDATE(CURDATE(),WEEKDAY(CURDATE() ) - 21)和date.time

0

我想說的是,如果您的表中存在跨多年的數據,那麼您應該始終包含Year()比較。

數據庫不知道,除非你告訴它,你只需要2012

所以,當你編寫一個查詢,你將包括:

select * 
from yourtable 
where week(yourdate) = week(CURRENT_DATE + INTERVAL -3 WEEK) 
    and year(yourdate) = year(CURRENT_DATE + INTERVAL -3 WEEK) 

同樣的事情,如果你是個比較:

select * 
from yourtable 
where month(yourdate) = month(CURRENT_DATE + INTERVAL -3 WEEK) 
    and year(yourdate) = year(CURRENT_DATE + INTERVAL -3 WEEK) 

這樣做可以確保您返回的數據符合周和年或月和年。