簡體   English   中英

PHP / MySQL-檢查雙人會議室的預訂

[英]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_timeend_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM