检查数据库上的日期

时间:2017-11-03 12:28:15

标签: php mysql

在我的数据库表中,我有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。

提前致谢!

2 个答案:

答案 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;