【问题标题】:MySQL Group By Dates BetweenMySQL 按日期分组
【发布时间】:2011-12-30 13:11:15
【问题描述】:

有没有办法对两个日期之间的记录进行分组?

例如,我的表中的记录如下所示:

rid     stamp                   uid
25      2005-07-05 14:10:29     25
1175    2005-08-12 15:47:35     29
290     2005-11-22 16:38:53     42
30      2005-12-01 10:48:12     47
30      2006-01-02 17:34:28     52
30      2006-02-06 22:11:35     57
30      2006-04-17 15:10:19     59
1195    2006-05-08 21:55:56     62
100     2006-06-30 15:51:04     94
45      2006-07-03 21:14:37     24

我正在尝试编写一个查询,该查询将按年份返回 February - AugustSeptember - January 之间的记录数,因此我得到的是:

July 2005 - January 2006:      3
February 2006 - August 2006:   5

【问题讨论】:

    标签: mysql group-by date-format


    【解决方案1】:

    如果只有一个组,那么您可以使用“group by with having 子句”。我认为没有语法可以在一个语句中指定多个不同的分组并将它们分开。这是我能想到的最简单的替代解决方案:

    select "July 2005 - January 2006" AS "Date", count(date) as "results" 
    from MYTABLE 
    where date >= '2005-07-01' AND date <= '2006-01-31'
    
    union
    
    select "February 2006 - August 2006" AS "Date", count(date) as "results" 
    from MYTABLE 
    where date >= '2006-02-01' AND date <= '2006-08-31';
    

    【讨论】:

      【解决方案2】:

      您几乎可以对任何您想要的东西进行分组。如果您可以在列中获取某些内容以显示您想要的内容,则可以对其进行分组。因此,只需两个时期,您就可以简单地对 if 进行分组:

      SELECT * FROM table
      GROUP BY if(stamp between "2005-07-01" and "2006-02-01", 0, 1)
      

      如果您需要更长时间(多年)的周期,您可以使用 period_diff 来区分:

      SELECT * FROM table
      GROUP BY floor(period_diff( DATE_FORMAT(stamp, "%Y%m"), "200507") / 6)
      

      它将以年月格式为您提供日期和开始期间之间经过的 6 个月块数。

      【讨论】:

        【解决方案3】:

        在其他的轻微组合中...... 您可以根据您想要的特定范围扩展案例结构。 group by 尊重“序数”列 1 的位置,因此您不必在 group by 子句中复制相同的 case 条件。此外,我加入了 Order by 以具有相同的案例上下文,因为否则它会按字母顺序排列结果。您可以按您想要的顺序进行排序……如果您希望最先列出最新的日期活动,甚至可以反过来。

        SELECT
              case when stamp between "2005-07-01" and "2006-02-01"
                      then "July 2005 - January 2006   "
                   when stamp between "2006-02-01" and "2006-08-01"
                      then "February 2006 - August 2006"
                   else    "After August 2006          "
              end as GroupColumn,
              count(*) as TotalPerGroup
           from  
              table
           where 
              date >= '2005-07-01'
           group by 
              1
           order by 
              case when stamp between "2005-07-01" and "2006-02-01"
                      then 1
                   when stamp between "2006-02-01" and "2006-08-01"
                      then 2
                   else    3
              end 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-23
          • 2010-10-31
          • 2019-02-14
          • 1970-01-01
          • 2023-03-09
          • 1970-01-01
          • 2011-07-21
          • 1970-01-01
          相关资源
          最近更新 更多