5

我有以下查询。

SELECT COUNT(*), WEEK(date), YEAR(date) FROM myTable GROUP ON YEAR(date), WEEK(date)

说它产生以下结果

32 33 2012
43 34 2012
39 35 2012
17 36 2012

我现在想在 2012 年第 35 周获取所有 39 条记录。但是,我不希望WEEK(date)=35 AND YEAR(date)=2012在我的 WHERE 子句中使用它,因为它不使用索引。相反,我希望找到边界并使用条件。我也不想使用 BETWEEN 因为可能会出现舍入错误。

因此,我尝试以下想法,一切都很好,但没有得到 39 条记录。显然 MySQL 和 PHP 对周的处理方式不同。我看到 MySQL WEEK() 使用模式 0、2、4 和 6,它们都返回从星期日开始的一周。理想情况下,我会拥有人们最常用的一个,最重要的是它与DateTime提供的相同。我该怎么做?谢谢

$w=35;$y=2012;   //Given
$w=sprintf('%02d',$w);    //Make sure it is two digits
$date = new DateTime($y.'W'.$w);
$d1=$date->format('Y-m-d');
$date->add(new DateInterval('P1W'));
$d2=$date->format('Y-m-d');
$sql='SELECT * FROM myTable WHERE date >= ? AND date < ?';
4

1 回答 1

12

关于 MySQL 的工作方式,您走在正确的轨道上,有各种模式用于与周相关的函数,可以产生不同的结果。http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_week

据我了解,相当于 PHP 日期逻辑的 MySQL 模式是模式 3,即 ISO 星期日期标准http://en.wikipedia.org/wiki/ISO_week_date

这有从星期一开始的周数和第 1-53 周。

所以你需要使用WEEK(date_field, 3)来获得 PHP 兼容的值。

As an alternate approach, one thing I have found handy in cases where you need the ability to flexibly query on different date ranges or aggregations (Q1- Q4, H1 - H2, etc.), or where you might need to utilize different weeks than PHP supports is to use a date helper table in MySQL (similar to what one may use as a date dimension table in a data warehouse, if you are familiar with that). It can give you a convenient table to join against in order to look up date ranges. Something like this should work:

http://databobjr.blogspot.com/2012/06/create-date-dimension-table-in-mysql.html

于 2013-01-23T00:01:10.327 回答