如果日期链长度超过5,我想检查MySQL。例如:
11-05-2016
12-05-2016
13-05-2016
14-05-2016
15-05-2016
这些是我的数据库中的行,这将是一个5的链。我想在我的表上触发,以保护我的数据不会使链大于5。
答案 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)