Проверка доступности по таблице бронирования в SQL - PullRequest
2 голосов
/ 24 июня 2009

Я пишу базу данных вакансий для забавы (и чтобы попытаться выучить T-SQL / SQL Server, и это то, что я пока имею в своей таблице приложений.

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 выяснит это достаточно легко.

Единственная проблема, с которой я столкнулся сейчас, заключается в том, чтобы выяснить, в какие дни не было бронирований. Я хотел бы выполнить поиск в следующей таблице, чтобы увидеть, какие даты доступны в комнате с location_id 100 между "2008-12-25 00:00:00" и "2008-12-30 00:00:00". и пусть он вернется, что в комнате с 27 по 28 не проводится собеседование.

Я уверен, что это мучительно легко, но, пожалуйста, возложите на меня некоторую мудрость SQL.

Ответы [ 3 ]

1 голос
/ 24 июня 2009

Вы можете сгенерировать временную таблицу, содержащую ваши дни (либо на верхнем уровне, либо с сохраненной функцией, что было бы лучше, если бы это было для целей изучения SQL), затем OUTER JOIN ее в таблице бронирования и отфильтровать по запись, имеющая NULL соответствующий application_id.

0 голосов
/ 24 июня 2009

Одним из способов может быть помещение диапазона дат в переменную таблицы и соединение.

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

Не проверено, но что-то подобное может сработать.

0 голосов
/ 24 июня 2009

Сначала я бы разбил ваш запрос "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 в противном случае. Это дает преимущество в работе, даже если блоки бронирования не всегда работают целый день.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...