2012-09-23 173 views
2

我有一个看起来像这样的日历表:MySQL中创建的日期范围

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

+0

你到目前为止试过的东西? –

回答

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 
+0

我刚刚尝试过,但只适用于数量为零的数据中只有两个范围的情况。该表格有多个日期范围数量为零的实例。有没有办法搜索整个表格? –

+0

它应该查看整个表格,我不确定这里可能有什么问题。它可能会错误地处理开放时间间隔(表格开始和结束时零数量的时间间隔)。您能否给我一个未正确处理的数据示例? – alexkorep

0

尝试了一些事情之后,解决该问题是查询:

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; 

谢谢大家的帮帮我。