-1

友達の休日の予約システムを作っています。

彼が休日に入るとき、私は日付がすでに使用されているかどうかを確認する必要があります。使用されている場合は、明らかに予約を作成できません。

私は現在使用しています:

SELECT * 
FROM anqehxy1kxmeowpcoqjj 
WHERE `from` BETWEEN '2013-01-16' AND '2013-01-23'

SELECT * 
FROM anqehxy1kxmeowpcoqjj 
WHERE `to` BETWEEN '2013-01-16' AND '2013-01-23'

2013年1月16日から2013年1月23日までの休暇を予約できるかどうかを確認します。

データベースには、2013年1月15日から2013年1月22日までの予約がすでにあります。つまり、予約しようとしている日付はすでに取得されています。ただし、すでに使用されているものとまったく同じ日付を使用しない限り、SQLは0行を返します。

これを修正する方法について何かアイデアはありますか?

注意として、人々は午前10時に出発し、次の人々は午後2時に到着します。

したがって、2週間連続で予約すると、次のようになります。

2013-01-14 -> 2013-01-21 
2013-01-21 -> 2013-01-28
4

3 に答える 3

5

2 番目のクエリで行ったように、日付を逆にすることはできません。に変更します

SELECT * 
FROM anqehxy1kxmeowpcoqjj 
WHERE `to` BETWEEN '2013-01-16' AND '2013-01-23'

補足: あなたのテーブル名は本当にanqehxy1kxmeowpcoqjj?!

于 2013-01-14T16:36:42.763 に答える
1

いずれかの日付と競合している場合に2つの日付を取得するには、次のようなクエリを使用します。このクエリは、競合している日付を返します。行が返されない場合は、特定のタイムスロットが空いていることを意味します。@start_timeと@end_timeは、予約する日付のパラメーターです。

select * from anqehxy1kxmeowpcoqjj 
where((@end_time > `from` and @end_time <= `to`) or 
        (@start_time >= `from` and @start_time < `to`) or 
        (@start_time <= `from` and @end_time >= `to`))
于 2013-01-14T16:40:28.627 に答える
0

最も簡単な方法は次のとおりだと思います。

select *
from anqehxy1kxmeowpcoqjj 
where @end_time >= `to` and @start_time <= `from`

これは、オーバーラップ インターバルの問題の例です。2 つの間隔は、一方が 2 番目の開始時またはその前に開始し、最初の開始時または後に終了する場合に重なります。

終了日が含まれるかどうかによっては、<and>ではなく<=、`>=' が必要になる場合があります。

于 2013-01-14T17:25:40.417 に答える