在我的数据库表中,我有2列,start_date和end_date。
示例数据将是:
-------------------------------
start_date | end_date
-------------------------------
2017-11-01 2017-11-02
2017-11-03 2017-11-07
2017-11-20 2017-11-28
2017-11-13 2017-12-02
-------------------------------
我需要查找是否连续5天还没有使用,在这种情况下,有:
(2017-11-08 to 2017-11-13)
我正在使用PHP和MySQL。
提前致谢!
答案 0 :(得分:3)
您需要根据实际数据检查边缘情况,以及是否没有重叠日期,但这是提供数据的良好开端。
假设表和数据定义如下:
TIMESTAMPDIFF
如果您订购行,并从它之前的结束日期开始延迟,并取任何5个或更多的间隙。在SQL Server中有LAG函数,但这是一种相同的方法。然后,如果您有一个包含所有行及其相应间隙的表格,则可以获取该期间的开始日期,并从两者之间的天数创建间隙期间。由于SET @end_date = NULL;
SELECT
DATE_ADD(`start_date`, INTERVAL -(`gap_from_last`-1) DAY) AS `start_date`,
`start_date` AS `end_date`
FROM
(
SELECT
`appointment_id`,
CASE
WHEN @end_date IS NULL THEN NULL
ELSE TIMESTAMPDIFF(DAY, @end_date, `start_date`)
END AS `gap_from_last`,
`start_date`,
@end_date := `end_date` AS `end_date` -- Save the lag date from the row before
FROM
`appointments`
ORDER BY
`start_date`,
`end_date`
) AS `date_gap` -- Build table that has the dates and the number of days between
WHERE
`gap_from_last` > 5;
具有包容性,因此您需要减去一天。
start_date | end_date
------------------------
2017-11-08 | 2017-11-13
提供:
$mech->content()
编辑:哎呀!忘记SQLFiddle(http://sqlfiddle.com/#!9/09cfce/16)
答案 1 :(得分:0)
SELECT x.end_date + INTERVAL 1 DAY unused_start
, MIN(y.start_date) unused_end
FROM appointments x
JOIN appointments y
ON y.start_date >= x.end_date
GROUP
BY x.start_date
HAVING DATEDIFF(MIN(y.start_date),unused_start) >= 5;