4

2 つの日付間隔が交差しているかどうかを確認するために、MySQL をチェックインする必要があります。私の問題をよりよく説明するには、イベント管理モジュールを持っています。次のように追加されたイベントがあるとします。

開始日 :'2013-09-09 08:00:00'

終了日 :'2013-09-09 10:00:00'

そして今、次のような別のイベントを追加したいと思います:

ケースA:

開始日 :'2013-09-09 09:00:00'

終了日 :'2013-09-09 11:00:00'

またはこのように:

ケース B:

開始日 :'2013-09-09 07:00:00'

終了日 :'2013-09-09 12:00:00'

その時間間隔 (08-10) にイベントが既に追加されているため、これを実行できないはずです

最初の例 ( case A) では、次のようにして問題を解決しました。

SELECT * FROM `events` as e 
    where 
    '2013-09-09 08:00:00' between e.ev_date_start and e.ev_date_end -- date start
    OR
    '2013-09-09 11:00:00' between e.ev_date_start and e.ev_date_end -- date end

しかし、2番目のケース(case B)については、私はそれを理解するのに苦労しています...

4

5 に答える 5

6

The idea is to check if they DO NOT intersect, and then negate.

NOT ('2013-09-09 08:00:00' >= e.ev_date_end OR e.ev_date_start >= '2013-09-09 11:00:00')

which is logically equivalent to

'2013-09-09 08:00:00' < e.ev_date_end AND e.ev_date_start < '2013-09-09 11:00:00'
于 2013-09-08T11:53:37.517 に答える
5

それらの両方をカバーするには、WHERE 句に 4 つのステートメントが必要です。

select *
  from `events` as e 
 where '2013-09-09 07:00:00' between e.ev_date_start and e.ev_date_end
    or '2013-09-09 12:00:00' between e.ev_date_start and e.ev_date_end
    or e.ev_date_start between '2013-09-09 07:00:00' and '2013-09-09 12:00:00'
    or e.ev_date_end between '2013-09-09 07:00:00' and '2013-09-09 12:00:00'

次のように簡単に見えるかもしれません:

select *
  from `events` as e 
 where @start between e.ev_date_start and e.ev_date_end
    or @end between e.ev_date_start and e.ev_date_end
    or e.ev_date_start between @start and @end
    or e.ev_date_end between @start and @end
于 2013-09-08T11:50:36.827 に答える
5

既に割り当てられている時間ブロックまたは割り当てられる予定の時間ブロックの開始時刻が互いにずれていないことだけをテストします。

select * from `events` as e 
where '2013-09-09 08:00:00' between e.ev_date_start and e.ev_date_end
or e.ev_date_start between '2013-09-09 08:00:00'and '2013-09-09 11:00:00'
于 2013-09-08T11:56:44.013 に答える