1

次のようなmysqlテーブルがあります。

| ID | date_start |  date_end  |
| 1  | 2013-10-17 | 2013-10-18 |
| 2  | 2013-10-28 | 2013-10-31 |

2 つの日付の間の空白期間を確認する必要があります。

日付範囲からレコードを取得するには、次のようにします。

SELECT * FROM `periods` WHERE ((date_start <= '2013-10-18' AND date_end >= '2013-10-18' AND date_end <= '2013-10-31') OR (date_start >= '2013-10-18' AND date_start <= '2013-10-31' AND date_end >= '2013-10-31') OR (date_start >= '2013-10-18' AND date_end <= '2013-10-31') OR (date_start <= '2013-10-18' AND date_end >= '2013-10-31'))

PHP では while ループで確認できますが、これを確認できる mysql クエリはありますか?

$first = true;
$emptyPeriod = false;
while ($period = mysql_fetch_assoc($result)) {
    if($first) {
        $first = false;
        $prevEndPeriod = $period['date_end'];
        continue;
    }

    $nextDay = date('Y-m-d', strtotime($prevEndPeriod . ' + 1 day'));

    if($nextDay != $period['date_start']) {
        $emptyPeriod = true;
        break;
    } else {
        $prevEndPeriod = $period['date_end'];
    }

}

echo ($emptyPeriod) ? 'Empty period' : 'OK';
4

2 に答える 2

0

次のクエリは、重複する期間の開始日を示します。複数ある場合は、間に空白のピリオドがあります。

select distinct s.date_start
from periods s
left join periods e
    on date_diff(s.date_start, e.date_end) <= 0
        and date_diff(s.date_start, e.date_end) >= -1
where e.id is null

あなたのphpコードは次のようになります:

echo (mysql_num_rows($result)>1) ? 'Empty period' : 'OK';

空の期間の開始日と終了日が必要な場合は、重複する期間の終了日を同様の方法で取得して、さらに一歩進めることができます。

于 2013-10-16T01:52:17.900 に答える