2017-02-18 82 views
0

我正在使用預定模塊進行時間調度。因爲我有兩個不同的time_data,一個是時間,另一個是預訂時間。現在我想顯示可用。檢查時間是否在多次之間(時間DataType)

這裏是數據time_data表

|---|---------| 
|id |vtime | 
|---|---------| 
|1 |08:00:00 | 
|2 |09:00:00 | 
|3 |10:00:00 | 
|4 |11:00:00 | 
|5 |12:00:00 | 
|6 |13:00:00 | 
|7 |14:00:00 | 
|8 |15:00:00 | 
|9 |16:00:00 | 
|10 |17:00:00 | 
|11 |18:00:00 | 
|12 |19:00:00 | 
|13 |20:00:00 | 
|14 |21:00:00 | 
|15 |22:00:00 | 
|---|---------| 

這裏是基於我運行一個內部聯接查詢來獲取可用時間booked_time數據數據

|----|----------|----------------|------------|----------------|-----------|---------| 
| id | userid | facilityid  | courtno | bookingdate | starttime | endtime | 
|----|----------|----------------|------------|----------------|-----------|---------| 
| 1 | 1  | 1    | 1   | 2017-02-20  |08:00:00 |11:00:00 | 
| 2 | 3  | 1    | 1   | 2017-02-20  |13:00:00 |15:00:00 | 
| 3 | 2  | 1    | 1   | 2017-02-20  |11:00:00 |13:00:00 | 
| 4 | 5  | 1    | 1   | 2017-02-21  |11:00:00 |13:00:00 | 
|----|----------|----------------|------------|----------------|-----------|---------| 

的booked_time表特定日期

我的查詢是

SELECT DISTINCT time_data.vtime FROM booked_time INNER JOIN time_data ON time_data.vtime>=booked_time.endtime OR time_data.vtime<booked_time.starttime WHERE facility_id='1' AND court='1' AND on_date='2017-02-20' 

但它顯示所有15個記錄的時間。它應該忽略08:00:00,09:00:00,11:00:00,12:00:00,13:00:00,14:00:00,15:00:00小時。

如何獲得可用時間?與這些表或我需要更改數據表結構?

回答

1

我想你想正確的邏輯是:

SELECT t.vtime 
FROM time_data t LEFT JOIN 
    booked_time b  
    ON t.vtime >= b.starttime AND 
     t.vtime < b.endtime AND 
     b.facility_id = '1' AND b.court = '1' AND 
     b.on_date = '2017-02-20' 
WHERE b.vtime IS NULL 

此找到任何匹配並刪除那些使用LEFT JOIN和比較NULL

使用NOT EXISTS替代似乎是一種更自然的方式來做到這一點:

select t.vtime 
from time_data t 
where not exists (select 1 
        from booked_time b  
        where t.vtime >= b.starttime and 
         t.vtime < b.endtime and 
         b.facility_id = '1' and b.court = '1' and 
         b.on_date = '2017-02-20' 
       ); 
+0

謝謝#Gordon Linoff。對於我第二個查詢正在工作。你可以解釋爲什麼你使用**選擇1 **之後不存在? – user1624540

+0

@ user1624540。 。 。使用'select'時,您需要選擇* something *。發現「1」是最容易輸入的內容,而且相當明確。 –

+0

謝謝@Gordon Linoff – user1624540

0
SELECT 
    time_data.* 
FROM time_data 
LEFT JOIN booked_time ON 
    time_data.vtime BETWEEN booked_time.starttime AND booked_time.endtime 
    AND booked_time.facility_id='1' 
    AND booked_time.court='1' 
    AND booked_time.on_date='2017-02-20' 
WHERE 
    ISNULL(booked_time.id) 

這首先加入使用LEFT JOIN,使其包括time_data記錄沒有任何聯接的記錄表。 然後使用WHERE排除有記錄加入的行。

+0

感謝您的回答。但它不起作用 – user1624540

相關問題