2009-06-24 10 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の知恵を私に築いてください。これと同様に

:(つまり、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

あなたはあなたの日を含む一時テーブルを生成することができ、 OUTER JOIN予約テーブルにあり、一致するapplication_idがNULLのレコードをフィルタリングします。

0

まず、「2008-12-25 00:00:00」から「2008-12-30 00:00:00」に1日の「期間」に分割します。これはテーブル変数と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 

2つの期間は、そうでない場合は重複し、そして0場合は1を返します。私はこのヘルパー関数を使用することをお勧めすることをすることができません。これは、予約ブロックが常に1日ではない場合でも作業するという利点があります。