[英]PHP/MySQL - Checking for double meeting room booking
我想在我要求的新時間段內隨時查找行。
這是我的表數據,具有現有行:
https://www.dropbox.com/s/1s4y8tl6s09emim/Screenshot%202014-04-04%2009.52.24.png
這是我要求的新時期:
Date: 2014-04-03
Start Time: 12:30:00
End Time: 13:30:00
在我請求的新時間段內隨時可以找到任何現有行的正確SQL
是什么?
到目前為止,我已經知道了,但是不確定start_time
和end_time
字段。
$sql = 'SELECT * FROM int_low_events WHERE start_date = "2014-04-03"';
我想您在表格中填寫了date
:
$sql = 'SELECT * FROM int_low_events WHERE date between '2014-04-03 12:30:00' and '2014-04-03 13:30:00'";
SELECT *,
ADDTIME(start_date, start_time) AS start,
ADDTIME(end_date, end_time) AS end,
'2014-04-03 14:00:00' AS proposed_start,
'2014-04-03 16:05:00' AS proposed_end
FROM int_low_events
HAVING (start BETWEEN proposed_start AND proposed_end OR end BETWEEN proposed_start AND proposed_end)
OR (proposed_start BETWEEN start AND end OR proposed_end BETWEEN start AND end)
這與我先前的(有效的)答案完全相同,但是(我認為)它更容易理解。 另外,您現在不必在任何地方填寫建議的開始日期和結束日期,而只需填寫一次( ... AS proposed_start
和... AS proposed_end
)。
根據您的數據庫設計, 此SQLFiddle確實可以正常工作。
它需要非常復雜,因為它需要獲取任何事件,而該事件在新建議的事件發生時正在運行。
id | start_date | start_time | end_date | end_time
---+------------+------------+------------+-----------
62 | 2014-04-03 | 12:00:00 | 2014-04-05 | 13:00:00
63 | 2014-04-03 | NULL | 2014-04-04 | NULL
64 | 2014-04-03 | 16:00:00 | 2014-04-03 | 17:00:00
65 | 2014-04-03 | 16:30:00 | 2014-04-03 | 17:30:00
66 | 2014-04-03 | 21:30:00 | 2014-04-03 | 22:30:00
這是數據庫中重要的部分。 假設我們有一個新事件,其日期如下: 2014-04-03 16:00 - 2014-04-03 18:00
。 在我之前的查詢中,它僅選擇了ID 64和65(因為這兩個ID在我們的新事件中都具有start_datetime或end_datetime)。
但是,ID 62確實也跨越了這個時間范圍,但開始時間較早,結束時間較晚。 使用新查詢時,也會選擇該查詢(如果這對您有意義)。
這是一個檢查兩個事件是否重疊的想法:您可以像這樣使用BETWEEN
:
SELECT a.event_id, b.event_id
FROM int_low_events AS a, int_low_events AS b
WHERE b.site_id = a.site_id AND
b.start_date = a.start_date AND
b.start_time BETWEEN a.start_time and a.end_time
這將適用於少於一天的事件,如數據庫屏幕快照中的事件。
您可能需要針對一天以上的活動進行調整。
因此,盡管這被稱為PHP問題,但實際上是數據庫問題?? ;-)
希望您的日期時間組合已在表格中編碼為日期時間字段,而不是兩個單獨的日期和時間字段。 如果不是這種情況,那么我強烈建議您構建一個將這兩個字段組合為一個視圖。 大大簡化了您的SQL和維護成本(對於將來嘗試修改的任何人)。
如果您不這樣做,那么搜索跨越幾天的事件時就會遇到嚴重的問題,這在該頁面的其他答案中也很明顯。
另外,您需要將傳入請求更改為日期時間組合。 您可以在綁定到SQL變量之前在PHP代碼中執行此操作。
然后,SQL看起來像這樣……
select *
from int_low_events a
where :proposed_start_datetime not between a.start_datetime and a.end_datetime
and :proposed_end_datetime not between a.start_datetime and a.end_datetime
-編輯-根據所有這一切的基礎數據庫,可以使用不同的方式來組合日期和時間字段。 如果您使用的是MySQL,請使用ADDTIME()
。 其他數據庫將具有它們自己執行相同操作的方式,從而使您可以將解決方案構建到SQL中,而不必修改數據庫邏輯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.