我有一个带有行的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浏览整个表条目的情况下完成吗?
谢谢!
答案 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;