每两周对mysql记录进行分组

Dee*_*pak 3 mysql

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

在下面的图像中,您可以看到日期21和14出现两周10.有任何建议吗?

Joe*_*ant 5

取结果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;
Run Code Online (Sandbox Code Playgroud)

参考:week()及其模式

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

没有内置函数可以从周数中获取任何日期.怎么可怜.

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

您所要做的就是从原始时间戳计算周末,但如果是从第一周开始计算,则还需要再增加7天,以便从每两周的第二周开始计算周末.(基于这篇文章.)我还添加了一年,以防万一.并且它还假设星期日是一周的第一天(但是检查你的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;
Run Code Online (Sandbox Code Playgroud)

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