2009-06-24 2 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 

это достаточно просто выяснить, какие заказы были сделаны на эти даты, просто выберите оператор будет найти их из достаточно легко

Единственная проблема у меня в том, как выяснить, что. дней НЕ НЕОБХОДИМЫ ЗАКАЗЫ. Я хотел бы выполнить поиск в следующей таблице, чтобы узнать, какие даты доступны в комнате с помощью location_id 100 между «2008-12-25 00:00:00» и «2008 -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» на «2008-12-30 00:00:00» на «периоды времени» одного дня. Это относительно легко с переменной таблицы и циклом 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 в противном случае. У этого есть преимущество работы, даже если блокировка бронирования не всегда полный день.

Смежные вопросы