SQL Server 2005. DateTime Сравнение двух столбцов одной таблицы - PullRequest
1 голос
/ 03 марта 2010

У меня есть запрос, У меня был стол с именем tblBooking В этой таблице 3 столбца

Column Names BookingID StartTime  EndTime
Datatype         int     DateTime  DateTime

Пример данных:

BookingID   StartTime    EndTime
    1         10:00       11:00
    2         11:00       12:00
    3         01:30       03:30

Мне нужно сравнить значения двух столбцов StartTime EndTime

Запрос: Я должен был выделить ресурс, например. Конференц-зал. Это можно делать ежедневно

between 10:00 am to 7:00 pm. 

Так что мне нужно проверить доступность зала заседаний на основе времени. Учитывая все сценарии. Этот вопрос был задан мне в интервью, на которое я не смог ответить, поэтому мне нужно найти способ, как это сделать

Ответы [ 3 ]

1 голос
/ 03 марта 2010

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

        |---|           PERIOD
--------------------------------------
|---|                  FINE
    |---|               FINE
    |------|            NOT FINE
        |---|           NOT FINE
         |-|            NOT FINE
           |------|     NOT FINE
            |---|       FINE
                |---|   FINE
    |-------------|     NOT FINE




DECLARE @tblBookings TABLE(
        BookingID INT,
        StartTime DATETIME,
        EndTime DATETIME
)

INSERT INTO @tblBookings SELECT 1, '01 Jan 2010 10:00:00', '01 Jan 2010 11:00:00'
INSERT INTO @tblBookings SELECT 2, '01 Jan 2010 11:00:00', '01 Jan 2010 12:00:00'

DECLARE @StartDate DATETIME,
        @EndDate DATETIME

--Inside        
SELECT  @StartDate = '01 Jan 2010 10:30:00',
        @EndDate = '01 Jan 2010 11:30:00'

SELECT  *
FROM    @tblBookings
WHERE   NOT( @EndDate <= StartTime OR @StartDate >= EndTime)

--Overlapping left      
SELECT  @StartDate = '01 Jan 2010 09:30:00',
        @EndDate = '01 Jan 2010 10:30:00'

SELECT  *
FROM    @tblBookings
WHERE   NOT( @EndDate <= StartTime OR @StartDate >= EndTime)

--Overlapping right     
SELECT  @StartDate = '01 Jan 2010 11:30:00',
        @EndDate = '01 Jan 2010 12:30:00'

SELECT  *
FROM    @tblBookings
WHERE   NOT( @EndDate <= StartTime OR @StartDate >= EndTime)

--Overlapping left and right
SELECT  @StartDate = '01 Jan 2010 09:30:00',
        @EndDate = '01 Jan 2010 12:30:00'

SELECT  *
FROM    @tblBookings
WHERE   NOT( @EndDate <= StartTime OR @StartDate >= EndTime)

--THIS ONE IS FINE
SELECT  @StartDate = '01 Jan 2010 09:00:00',
        @EndDate = '01 Jan 2010 10:00:00'

SELECT  *
FROM    @tblBookings
WHERE   NOT( @EndDate <= StartTime OR @StartDate >= EndTime)
0 голосов
/ 03 марта 2010

вы можете найти все «коллизии» между заданным диапазоном даты / времени и всеми существующими диапазонами даты / времени в вашей таблице с помощью запроса, подобного этому:

DECLARE @YourTable table (BookingID int,StartTime datetime,EndTime datetime)

INSERT INTO @YourTable VALUES (1, '2010-03-03 10:00am', '2010-03-03 10:30am')
INSERT INTO @YourTable VALUES (2, '2010-03-03 11:30am', '2010-03-03 01:30pm')

DECLARE @StartDate datetime
       ,@EndDate datetime

SELECT @StartDate='2010-03-03 9:00am'
      ,@EndDate='2010-03-03 10:15am'
;WITH AllDates AS
(
    SELECT @StartDate AS DateOf
    UNION ALL
    SELECT DATEADD(mi,30,DateOf) --smallest increment to consider is 30 minutes
        FROM AllDates
    WHERE DateOf<@EndDate
)
,Collisions AS
(SELECT
     * 
     FROM @YourTable         y
         INNER JOIN AllDates a ON a.DateOf>=y.StartTime AND a.DateOf<=y.EndTime
)
SELECT * FROM Collisions

ВЫВОД:

BookingID StartTime               EndTime                 DateOf
--------- ----------------------- ----------------------- -----------------------
1         2010-03-03 10:00:00.000 2010-03-03 10:30:00.000 2010-03-03 10:00:00.000
1         2010-03-03 10:00:00.000 2010-03-03 10:30:00.000 2010-03-03 10:30:00.000

(2 row(s) affected)
0 голосов
/ 03 марта 2010

Вы можете иметь несколько критериев в предложении where ... МЕЖДУ может сравнивать несколько дат и времениНапример:

where requestedStartTime not between startTime and endTime
and requestedEndTime not between startTime and endTime
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...