2014-05-06 48 views
0

我有這樣的預訂表:查找與可用時隙天爲一個特定的時間預訂

+------------+----------+----------+ 
| date  | time  | duration | 
+------------+----------+----------+ 
| 2014-05-10 | 13:00:00 | 60  | 
| 2014-05-13 | 09:00:00 | 60  | 
| 2014-05-13 | 10:00:00 | 60  | 
| 2014-05-13 | 13:00:00 | 60  | 
| 2014-05-13 | 17:00:00 | 60  | 
| 2014-05-13 | 18:00:00 | 60  | 
| 2014-05-14 | 09:00:00 | 720  | 
| 2014-05-15 | 09:00:00 | 60  | 
| 2014-05-15 | 11:00:00 | 60  | 
| 2014-05-15 | 12:00:00 | 60  | 
+------------+----------+----------+ 

所以,我可以有時間的一小時或全天預訂的預訂。

現在,我想創建一個小時的新預訂,並且我想知道特定月份的哪些日子有空閒時間。我不想知道所有空閒插槽(像其他SO問題),我只想知道什麼天可以分配此預訂。 所以,瞭解開閉時間,新的預約時間和月份,我需要一個SQL查詢,可以返回這樣的事情:

+------------+ 
| free_days | 
+------------+ 
| 2014-05-01 | 
| ...  | 
| 2014-05-08 | 
| 2014-05-09 | 
| 2014-05-10 | 
| 2014-05-11 | 
| 2014-05-12 | 
| 2014-05-13 | 
| 2014-05-15 | 
| ...  | 
| 2014-05-31 | 
+------------+ 

2014年5月14日,是因爲缺少有一個全天預訂,但其他日子可能會丟失,例如,12個一小時的預訂。

我看過其他的SO文章,但我無法適應它。任何想法 ?

+1

沒有數據庫,但如果我理解正確的問題,像'SELECT日期free_days FROM預訂總數(持續時間)<720 GROUP BY日期「應該接近。您希望總預訂數低於閾值的日子。 –

+1

我認爲數據庫重新設計可以幫助你解決這個問題。假設1小時插槽,請創建一個包含所有可用插槽的表格。包含一個已預訂的列。然後,您可以檢查記錄的預訂位置爲空或具有默認值的記錄。 –

+0

謝謝@JohnC,這是非常接近的,但我改變它使用HAVING而不是SUM,因爲你不能在WHERE中使用SUM。但是,如果這一天已經出現在表格中,那麼這個有空閒時間的日子就會回來。使用我的示例預訂表,這將返回10,13和15天。我希望從一個月的所有日子,包括那些不在表中並且全天都有空的日子。我可以在使用PHP進行查詢之後添加它,但完整的SQL查詢將是完美的。 – Juanjico

回答

0

我只在SQL Server中測試了這個,應該是非常相似的,雖然我想:我的機器上運行

create table #AllDatesInRange 
(
    date datetime 
) 

declare @maxDate datetime 
declare @currentdate datetime 

set @maxDate = (select max(date) from table_1) 
set @currentdate = (select min(date) from table_1) 

while @currentdate <= @maxDate 
begin 
    insert #AllDatesInRange(date) values(@currentdate) 
    set @currentdate = dateadd(day,1,@currentdate) 
End 

--missing dates 
SELECT A.date, 'Free All Day' as [Free slots] from #AllDatesInRange A 
LEFT JOIN table_1 B ON 
A.date = B.date 
WHERE B.date IS NULL 

UNION All 

select date, 'One or more slots free' as [Free slots] FROM table_1 
group by Date 
having sum(duration) < 720