2009-06-24 97 views
2

我正在寫一個職位空缺數據庫一點樂趣(和嘗試和學習T-SQL/SQL Server的,這就是我在我的申請表,到目前爲止在預訂表檢查可用性。初學者:在SQL

application_id name   interviewer  location_id  from     to 
----------------------------------------------------------------------------------------------------------- 
1    Joe Bloggs Sarah Saunders 100    2008-12-25 00:00:00 2008-12-26 00:00:00 
2    Barry White Issac Hayes  100    2008-12-29 00:00:00 2008-12-30 00:00:00 

這是很容易找出預訂已經爲這些日期作出;一個簡單的SELECT語句會發現這些出足夠容易

我現在唯一的問題是如何找出什麼。天不包含預訂。我想在下面的表格中查找在「2008-12-25 00:00:00」和「2008年之間location_id 100」的房間中有哪些日期可用-12-30 00:00:00「,並且從27日到28日沒有在房間裏進行採訪的回報。

我確信這很容易,但請給我一些SQL智慧。

此類似:How to implement check availability in hotel reservation system

回答

0

一種方法是將日期範圍放入表變量中並加入。

declare @startDate datetime, @endDate datetime 

SET @startDate = '2009-05-01' 
SET @endDate = '2009-05-31' 

declare @dates table (date datetime) 

insert into @dates values (@startDate) 

while @startDate < @endDate 
begin 
    set @startDate = @startDate + 1 

    insert into @dates values (@startDate) 
end 

select d.* from applications a 
left join @dates d on d.date between a.from and a.to 
where a.application_id is null 

未經測試,但類似的東西可能工作。

1

可以生成包含你的日子的臨時表(無論是在上層或具有存儲功能,它會更好,如果這是SQL學習目的),然後OUTER JOIN它在預訂表上並過濾記錄與NULL匹配application_id。

0

首先,我會被打破您的查詢「2008-12-25 00:00:00」到「00:00:00 2008-12-30」到每一天「的時間段」開始。這對於表變量和while循環來說是相對容易的,所以我不會在這裏進入。

,那麼你可以通過每個從表變量的時間週期循環,看看它是否重疊任何現有預訂的(你只會拉出重疊查詢時間段的預約)。爲此我建議使用這個幫助函數:

CREATE FUNCTION [dbo].[fn_TimePeriodsOverlap] 
(
    @pStartTP1 datetime, 
    @pEndTP1 datetime, 
    @pStartTP2 datetime, 
    @pEndTP2 datetime 
) 
RETURNS bit 
AS 
BEGIN 
    DECLARE @Result bit 
    SET @Result = 0 

    IF @pStartTP1 >= @pStartTP2 AND @pStartTP1 < @pEndTP2 
      SET @Result = 1 
    ELSE IF @pEndTP1 >= @pStartTP2 AND @pEndTP1 < @pEndTP2 
      SET @Result = 1 
    ELSE IF @pStartTP2 >= @pStartTP1 AND @pStartTP2 < @pEndTP1 
      SET @Result = 1 
    ELSE IF @pEndTP2 >= @pStartTP1 AND @pEndTP2 < @pEndTP1 
      SET @Result = 1 

    RETURN @Result 

END 

如果兩個時間段重疊,則返回1,否則返回0。即使預訂區塊並不總是一整天,這也具有工作的優勢。