【问题标题】:Mysql Group by date week selection duplicates a weekMysql Group by date week selection 重复一周
【发布时间】:2016-05-19 12:54:11
【问题描述】:

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

这是我的查询

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'),

【问题讨论】:

  • 您明白您的查询毫无意义吗?如果没有分组功能,您无法对具有不同值的字段进行分组...
  • 我有一个记录表,其中有一个 billing_date 日期列,其日期为“2016-01-01”,我想根据另一个父查询对它们进行分组。我如何将这些日期分组为月周?

标签: mysql


【解决方案1】:

您对YEARWEEK 的工作方式感到困惑。来自reference

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

按照(并不奇怪)惯例,2016 年 1 月 1 日是 2015 年的第 52 周,因为它是星期五; 1 月 3 日是星期日,而是 2016 年的第一周。您可以使用可选的第二个参数 mode 稍微更改此机制,它允许您指定一周的第一天。有关详细信息,请参阅docs for the WEEK function

编辑

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

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

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

【讨论】:

  • 按周分组(billing_date, 0) 也返回相同的值我如何避免重复?
  • WEEK 完全一样。如果使用周数,则无法避免此类情况,因为一月的第一天几乎总是在前一年的最后一周。所以重点是,你的分组逻辑是什么?你会如何用文字来解释?
  • 每个月的每一天都有条目我想按周对一个月进行分组,然后只获取一周中的任何日期,这并不重要我有另一个查询来处理其余的我只是需要此查询以显示每个月的 4 周结果以及该周的日期。
  • 谢谢@Aioros GROUP BY FLOOR((DAYOFMONTH(billing_date) - 1) / 7) + 1 成功了
  • 嗨,我认为这不是解决方案。如果计费日期从 2017 年 1 月 16 日开始,在这种情况下从 2017 年 1 月 24 日结束,会发生什么?
【解决方案2】:

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

嗯,这取决于您认为一周的开始日期!

如果您查看有关yearweek() 函数的mysql 文档,您会看到它有第二个可选参数,称为mode:

mode 参数的工作方式与 WEEK() 的 mode 参数完全相同。为了 单参数语法,使用模式值 0。

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

【讨论】:

  • 按周分组(billing_date, 0) 也返回相同的值
  • 当然可以,因为 week(billing_date, 0) = week(billing_date) !您应该使用 week(billing_date, 1) 将星期一作为一周的第一天,而不是星期日。
  • @Shadow week(billing_date, 1) 这是正确的
猜你喜欢
  • 2021-02-22
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-20
  • 2018-05-18
  • 2018-06-29
相关资源
最近更新 更多