MYSQL检查是否存在日期链

时间:2016-05-17 12:48:28

标签: mysql

如果日期链长度超过5,我想检查MySQL。例如:

11-05-2016  
12-05-2016  
13-05-2016  
14-05-2016  
15-05-2016

这些是我的数据库中的行,这将是一个5的链。我想在我的表上触发,以保护我的数据不会使链大于5。

1 个答案:

答案 0 :(得分:0)

这是一个不完整的答案......

我不假装这很漂亮(并且它也很难缩放),但这至少证明了其他人可能会建立起来的原则......

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table(dt DATE NOT NULL PRIMARY KEY);

INSERT INTO my_table VALUES
('2016-05-01'),
('2016-05-02'),
('2016-05-03'),
('2016-05-05'),
('2016-05-07'),
('2016-05-08'),
('2016-05-09'),
('2016-05-11'),
('2016-05-12'),
('2016-05-13'),
('2016-05-14');

这里我们有连续3天(第1到第3),接着连续1天(第5天),然后连续3天(第7到第9),接着连续4天连续(第11天到第3天)第14次)。

所以,我们应该能够插入一个' 2016-05-15' (因为这将产生5天的连续性),但不是2016-05-10' (因为这会产生8天的连续性)。

1。 2016年5月10日

SET @x = '2016-05-10';

SELECT  a.dt start
     ,  MIN(c.dt) end 
  FROM 
     ( SELECT dt FROM my_table 
       UNION
       SELECT @x
     ) a
  LEFT 
  JOIN
     ( SELECT dt FROM my_table 
       UNION
       SELECT @x
     ) b
    ON b.dt = a.dt - INTERVAL 1 DAY
  LEFT 
  JOIN 
     ( SELECT dt FROM my_table
       UNION
       SELECT @x
     ) c
    ON c.dt >= a.dt
  LEFT 
  JOIN 
     ( SELECT dt FROM my_table       
       UNION
       SELECT @x
     ) d
    ON d.dt = c.dt + INTERVAL 1 DAY
 WHERE b.dt IS NULL 
   AND c.dt IS NOT NULL
   AND d.dt IS NULL
 GROUP  
    BY a.dt
HAVING DATEDIFF(end,start)>5;

+------------+------------+
| start      | end        |
+------------+------------+
| 2016-05-07 | 2016-05-15 |
+------------+------------+

2。 2016年5月15日

SET @x = '2016-05-15';

SELECT  a.dt start
     ,  MIN(c.dt) end 
  FROM 
     ( SELECT dt FROM my_table 
       UNION
       SELECT @x
     ) a
  LEFT 
  JOIN
     ( SELECT dt FROM my_table 
       UNION
       SELECT @x
     ) b
    ON b.dt = a.dt - INTERVAL 1 DAY
  LEFT 
  JOIN 
     ( SELECT dt FROM my_table
       UNION
       SELECT @x
     ) c
    ON c.dt >= a.dt
  LEFT 
  JOIN 
     ( SELECT dt FROM my_table       
       UNION
       SELECT @x
     ) d
    ON d.dt = c.dt + INTERVAL 1 DAY
 WHERE b.dt IS NULL 
   AND c.dt IS NOT NULL
   AND d.dt IS NULL
 GROUP  
    BY a.dt
HAVING DATEDIFF(end,start)>5;

Empty set (0.03 sec)