Mysql Group按日期周选择重复一周

时间:2016-02-09 13:48:05

标签: mysql

我需要选择账单并创建特定的每周日历。

这是我的查询

SELECT billing_date FROM tabde GROUP BY week(billing_date);

我得到的是2016年2月的结果

$result = array(
  array('billing_date' => '2016-01-01'),
  array('billing_date' => '2016-01-03'),
  array('billing_date' => '2016-01-10'),
  array('billing_date' => '2016-01-17'),
  array('billing_date' => '2016-01-24')
  );

这是重复的,因为这两天都在同一周内

array('billing_date' => '2016-01-01'),
array('billing_date' => '2016-01-03'),

2 个答案:

答案 0 :(得分:3)

您对YEARWEEK的工作原理感到困惑。来自reference

  

返回日期的年份和周数。结果中的年份可能是   不同于第一个和第二个日期参数中的年份   今年的最后一周。

2016年1月1日举行的(不那么奇怪的)会议是在2015年的第52周,因为它是星期五; 1月3日是星期日,而不是2016年的第1周。您可以使用可选的第二个参数mode稍微改变这种机制,它允许您指定一周的第一天。有关详细信息,请参阅docs for the WEEK function

修改

由于您似乎正在寻找按月一周分组数据的方法,因此您可以尝试以下方法:

GROUP BY FLOOR((DAYOFMONTH(billing_date) - 1) / 7) + 1

基本上,您将日期数除以7(进行必要的计算调整)。这是来自similar question,并附带了类似的警告:分割数据有点奇怪。特别是,这假设您始终计算从该月的第一天开始计算的周数,当然,不同的月份将有不同的周数。不过,它应该做你想做的事。

答案 1 :(得分:2)

  

这是重复的,因为这两天都在同一周内

那么,这取决于你考虑一周开始的那一天!

如果您查看yearweek()函数的mysql文档,那么您将看到它有第二个可选参数,称为模式:

  

mode参数与WEEK()的mode参数完全相同。对于   单参数语法,使用模式值0。

如果您在week() function下查找mode参数的含义,那么您会看到0表示星期日被视为一周的第一天。 2016-01-03是一个星期天。