2013-01-08 48 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) 

这样做可以确保您返回的数据符合周和年或月和年。