1

这是我的查询的一部分:

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中找到了类似的查询, 但他们没有提到这样的问题,即使没有年份比较,它似乎也适用于他们。

4

2 回答 2

2

通过与所需一周的开始和结束进行比较,您会得到更好的服务。就像是:

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

在今年的第一周和最后一周有所不同。例如 2012-12-31 是 2013-W01 的一部分(2013 的第一周。所以WEEK会说1whileYEAR会说2012。而对于 2013-01-13,2013-W01WEEK的一部分1也是。所以天真地使用and会给你错误的结果。YEAR2013WEEKYEAR

于 2013-01-08T10:29:00.680 回答
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) 

这样做可确保您返回与周和年或月和年相匹配的数据。

于 2013-01-08T10:22:08.040 回答