从sql表中获取缺少的日期

时间:2012-03-20 22:40:19

标签: mysql date datediff

我有一个带有行的mysql表:ID,name,startDate,endDate。

通常,日期应该是连续的,我想在缺少间隔的情况下提醒用户。

说我已插入此日期:

2012-03-25 -> 2012-03-29
2012-04-02 -> 2012-04-05

我想要显示像

这样的信息
"No dates found from 2012-03-29 to 2012-04-02. Please insert data for this interval"

这可以在不使用php浏览整个表条目的情况下完成吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

SELECT t1.endDate AS gapStart, (SELECT MIN(t3.startDate) FROM `table` t3 WHERE t3.startDate > t1.endDate) AS gapEnd
FROM `table` t1
LEFT JOIN `table` t2
    ON t1.endDate = t2.startDate
WHERE t2.startDate IS NULL

答案 1 :(得分:0)

是的,可以在不使用PHP浏览整个表的情况下完成,而是必须使用mysql浏览整个表。一个粗略的解决方案是:

SELECT a.enddate AS start_of_gap, 
(SELECT MIN(c.startdate)
 FROM yourtable c
 WHERE c.startdate>a.enddate) AS end_of_gap
FROM yourtable a
WHERE NOT EXISTS (
   SELECT 1
   FROM yourtable b
   WHERE b.startdate=a.enddate + INTERVAL 1 DAY
);

我希望如果我再考虑一下,会有更高效(但可能不那么明显)的方法。

答案 2 :(得分:0)

这很有效。我包含用于创建表和插入数据的代码以用于测试目的。

 create table dates(
id int(11) not null auto_increment,
name varchar(16) not null,
startDate date,
endDate date,
primary key(id)
);

insert into dates (name,startDate,endDate) 
values('personA', '2012-03-25', '2012-03-29'),
      ('PersonB','2012-04-02', '2012-04-05');

所以这是查询:

 select d1.endDate,d2.startDate 
 from dates d1, dates d2 
 where (d1.id+1) =d2.id and d1.endDate < d2.startDate;