2012-03-20 15 views
3

ID、名前、開始日、終了日の列を持つmysqlテーブルがあります。SQLテーブルから欠落した日付を取得する

日付は連続している必要があります。間隔がない場合は、ユーザーに警告する必要があります。

私はこの日付が挿入されてい言う:

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

私はあなたの説明でより徹底する必要があると思います。たとえば、 - 2012-01-03 - > 2012-01-05と2012-01-06 - > 2-12-01-09の場合、それを表示する必要がありますか?それは、2012年1月1日と2012年1月2日の間の格差を意味します。 – nnichols

+0

それは1日が不足していることを警告する必要があります、1つのエントリのendDateは、他の最初のものでなければなりません – GabrielCol

答えて

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 
+0

これはうまくいくように見え、もっとテストしてお知らせします。どうもありがとう!!! – GabrielCol

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 
); 

私はいくつかのより多くのそれについて考えた場合、より効率的な(しかし、おそらくあまり目立たない)方法があるだろう期待しています。

+0

より具体的にしてくださいできますか?私はstartDateとendDateという2つの行を持っていますが、どこにでもdateという名前の行を使いました。ありがとうございます – GabrielCol

+0

おっとり - ここに混乱があります。質問を正しく読まず、データが正規化されていると仮定しました。私はクエリを修正します - BTWは列または属性 - 行ではありません。 – symcbean

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; 
+1

IDと日付の両方の範囲が連続していると想定することはできません。状況を修正するには、ギャップをカバーする値で挿入する必要があると考えてください。新しく挿入された行は順不同です。 – nnichols

+0

サブクエリを避けることに焦点を当てて、私はその詳細を逃した。私はあなたのコメントを投票します。あなたの観察を共有してくれてありがとう。 – kasavbere

関連する問題