根据另一列MySQL中创建日期范围(MySQL creating date ranges based

2019-09-22 20:29发布

我有一个看起来像这样的日历表:

    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查询给我的每个条目,但我无法弄清楚如何创建日期范围。

Answer 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表本身两次:第一次加入( cprev表)选择其在每个比日期更小的最大日期c表行。 这给了我们时间间隔的起点行所属。 第二个连接结束以同样的方式选择时间间隔。

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

我测试的查询与您的数据,这里是输出:

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


Answer 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;

谢谢大家的帮助。



文章来源: MySQL creating date ranges based on another column
标签: mysql date range