【问题标题】:MySQL creating date ranges based on another columnMySQL基于另一列创建日期范围
【发布时间】:2012-09-15 00:16:03
【问题描述】:

我有一个如下所示的日历表:

    date   |  qty
-------------------
1998-11-18 |  2
1998-11-19 |  0
1998-11-20 |  0
1998-11-21 |  0
1998-11-22 |  3
1998-11-23 |  0
1998-11-24 |  0
1998-11-25 |  3

我正在尝试生成一份报告,该报告将提供具有 0 数量值 (qty) 的条目范围。我无法对日期进行硬编码,它们需要由第二列的值确定。从上面看,报告应该是这样的:

1998-11-19 - 1998-11-21  
1998-11-23 - 1998-11-24

所有GROUP BYUNION 查询都为我提供了单独的条目,但我不知道如何创建日期范围。

【问题讨论】:

    标签: mysql date range


    【解决方案1】:

    假设表名是calendar,下面的查询就完成了:

    SELECT 
       MIN(t.date),
       MAX(t.date)
    from
        (SELECT
            c.date,
            MAX(prev.date) mindat,
            MIN(next.date) maxdat
        FROM 
            calendar c,
            calendar prev,
            calendar next
        WHERE 
            c.qty = 0 AND
            c.date > prev.date AND prev.qty != 0 AND
            c.date < next.date AND next.qty != 0
        GROUP BY
            c.date) t
    GROUP BY
        mindat, maxdat
    

    在内部查询中,我们基本上将calendar 表连接到自身两次:第一次连接(c 表到prev 表)为每个c 表行选择小于日期的最大日期。这给了我们该行所属区间的开始。第二个连接选择以相同方式结束的间隔。

    外部查询从间隔中提取最小和最大日期。

    我用您的数据测试了查询,这是输出:

    min(t.date) max(t.date)
    1998-11-19  1998-11-21
    1998-11-23  1998-11-24
    

    【讨论】:

    • 我刚刚尝试过,但仅适用于数据中只有两个范围且数量为零的情况。该表有多个实例,其中日期范围的数量为零。有没有办法搜索整个表格?
    • 它应该查看整个表格,我不确定这里可能有什么问题。它可能会错误地处理开放区间(表格开头和结尾处的数量为零的区间)。您能否举一个未正确处理的数据示例?
    【解决方案2】:

    尝试了很多事情后,解决问题的查询是:

    SELECT start_date, MAX(dates) AS End
    FROM (
      SELECT calendar.*,
             @f:=CONVERT(
                 IF(@r<=>gty AND DATEDIFF(dates, @d)=1, @f, dates), DATE
               ) AS start_date,
               @d:=dates, @r:=gty
      FROM     calendar JOIN (SELECT @d:=NULL) AS init
      where gty="0"
      ORDER BY gty, dates
    )  AS t
    GROUP BY start_date, gty;
    

    感谢大家的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-06
      • 2011-01-10
      • 1970-01-01
      相关资源
      最近更新 更多