2012-04-26 53 views
2

我在使用我必須建立的預訂系統(PHP/Mysql)驗證日期時遇到了麻煩。 我之前發過類似的問題Reservation system dates但是有些變化。預約系統租用一天的區塊

我遇到的問題; 我們在辦公室有一間工作室/會議室。這是有限的時間租金。用戶選擇什麼日子,什麼時間以及他要租用房間多少小時。

預訂一步一步:

1-用戶選擇他想要租工作室的月份。 2-用戶選擇他想租賃演播室的那一天。 (這裏我卡住了) 3-用戶選擇他希望得到密鑰的時間。

時間上,關鍵是應收款:

00:00:00 - 06:00:00 
06:00:00 - 12:00:00 
12:00:00 - 18:00:00 
18:00:00 - 24:00:00 

這些時間的時候,在用戶將收到大門的鑰匙。

4-用戶選擇他希望租用工作室的小時數。

問題: 我能夠檢查工作室租用的日期,但不是確切的時間。 我知道如何在PHP中檢查時間。但是,例如,

用戶1於2012年4月27日12:00:00至18小時後出租演播室。 用戶2想要在2012年4月26日18:00:00至12小時後租用工作室。 用戶3想在4月28日租用工作室。

我如何能夠檢查用戶2是否可以租到工作室,直到最大27日4月12:00:00。 如何檢查用戶3是否可以在28日租用工作室並確保在06:00之後可用。

數據庫:

id     int(11) 
user_id    int(11) 
rental_name   varchar(255) 
key_receive_time varchar(255) 
start_date   int(11) 
end_date   int(11) 
total_hours  int(11) 

我一直在這2天連續現在,仍然無法破解它。我認爲解決方案很簡單,但我可能在錯誤的方向搜索。

在此先感謝。

EDIT例如queryie:

SELECT * FROM reservations 
WHERE (start_date >= " . $start_block_1 . " AND end_date <= " . $end_block_1 . ") 
OR (start_date >= " . $end_block_1 . " AND end_date <= " . $start_block_1 . ") 

$start_block_1$end_block_1表示時間戳00:00:00 - 一天的六點00分00秒塊。

我執行此查詢4次,因爲在用戶可以拾取密鑰的當天有4個塊。

+0

您的查詢如何查看以及它們出錯的位置? – 2012-04-26 08:34:37

+0

實施例的查詢:( 「$ start_block_1」「。$ end_block_1 」起始日期> = \t \t \t \t日期和結束日期<=)'SELECT * FROM保留WHERE \t \t \t OR(起始 \t \t \t> =「 。。$ end_block_1 「 \t \t \t \t日期和結束日期<=」 $ start_block_1「)'的$ start_block_1和$ end_block_1代表** 00:00:00 - 06:00: – 2012-04-26 08:37:56

+0

一天的00 **塊你是否在'start_date'和'end_date'列中存儲了日期和時間?這是一個簡單的查詢。 – 2012-04-26 08:41:47

回答

1

好像你需要檢查一個時間間隔 - 一對開始日期和結束日期 - 是否與數據庫中存在的時間間隔相沖突。如果這是你想要的,那麼這裏是查詢:

-- //// FOR TESTING \\\\ 
CREATE TABLE reservations (start_date INT, end_date INT); 

INSERT INTO reservations(
    start_date, 
    end_date 
) 
VALUES (
    UNIX_TIMESTAMP('2012-04-27 12:00:00'), -- start date booked by user 1 
    UNIX_TIMESTAMP('2012-04-28 06:00:00') -- end date booked by user 1 
); 

SET @d1 = UNIX_TIMESTAMP('2012-04-26 18:00:00'); -- start date requested by user 2 
SET @d2 = UNIX_TIMESTAMP('2012-04-27 06:00:00'); -- end date requested by user 2 
-- \\\\ FOR TESTING //// 

SELECT 1 
FROM reservations 
WHERE 
(@d1  <= start_date AND start_date < @d2 ) OR -- start datetime lies "inside" the interval 
(@d1  < end_date AND end_date <= @d2 ) OR -- end datetime lies "inside" the interval 
(start_date <= @d1  AND @d2  <= end_date) -- the interval itself lies inside start and end datetime 

該查詢將返回與給定時間間隔衝突的行。變量@d1@d2用於在mysql客戶端中測試您的查詢;將它們替換爲從PHP代碼傳入的數據。

注意:比較運算符<<=可能需要根據開始/結束日期時間是包含還是排除來進行更改。

+0

是d1和d2的php變量和@ d1開始當前塊的start_timestamp? – 2012-04-26 09:06:15

+0

'@ d1'和'@ d2'是用戶選擇的開始和結束日期(「用戶2想要租用」日期)。如果查詢返回一個或多個行,則該間隔不可用。 – 2012-04-26 09:10:16

+0

你先生,我的一天。最後,我仍然使用d1(start_timestamp)和d2(end_timestamp)作爲時間戳,並完成了工作。 我不能說我多麼感謝你的幫助!謝謝! – 2012-04-26 15:38:01