我想每两周对其时间戳字段上的记录进行分组。我现在每周都做一次,但我也希望每两周一次。我怎么做 ?有没有一种特定的方法来做到这一点,比如我们如何使用 WEEK('timestamp','%d-%m-%Y') 函数按周分组?

在下面的图片中,您可以看到第 21 和 14 日将在两周 10 中出现。有什么建议吗?

最佳答案

week() 的结果除以 2,转换为整数(向上或向下)。因为一年的第一周是第 1 周(取决于 week() 使用的模式)并且您可能希望第 1 周和第 2 周都成为第 1 周,以便第 0 周成为第 0 周,我们将使用 ceil() :

select sum(amount) as amountSum, ceil(week(myTimestamp)/2) as fortnight
  from myTable
  group by fortnight
  order by fortnight;

引用: week() and its modes

编辑 :在获得两周的最后一天...

没有内置函数可以从周数中获取任何日期。好烦啊

由于您在两周内进行聚合和分组(因此结果行可能有几十个),我通常首先考虑在使用结果的客户端代码中计算此类填充值,但事实证明这样做实际上更容易由于访问原始时间戳而在数据库中,即使它很丑陋。

您所要做的就是根据原始时间戳计算一周的结束时间,但如果是从第一周开始,您还必须再添加 7 天,以便您从每两周的第二周开始计算一周的结束时间。 (基于 this article 。)我还添加了年份,以防万一。并且它还假定星期日是一周的第一天(但请对照表检查您的 MySQL 实例的 default_week_format,以便对 week() 进行仔细检查)。
select sum(amount) as amountSum, year(myTimestamp) as yr, ceil(week(myTimestamp)/2) as fortnight,
  date_add(myTimestamp, interval (7 - dayofweek(myTimestamp)) + ((week(mytimestamp) % 2) * 7) day) as endoffortnight
  from myTable
  group by yr, fortnight
  order by yr, fortnight;

我希望这有效或足够接近。我没有用太多数据测试它。

关于mysql - 每两周对 mysql 记录进行分组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6165869/

10-12 14:36