2014-01-10 7 views
-1

У меня есть простая таблица с кучей претендентов, где у них есть данные о времени начала, времени окончания и даты. Я хочу выяснить, кто доступен для определенной даты в пределах временного диапазона.TSql Query for Time Range

В таблице ниже показано, где даты начала и окончания Колонны говорит нам, что они заказали для этой даты/времени .........

AppID  StartTime   EndTime   Date 
H12   8:00    13:00   12/1/2013 
H12   14:00   16:00   12/1/2013 
H12   19:00   21:00   12/1/2013 
H14   17:00   18:00   12/1/2013 
H13   14:00   16:00   12/1/2013 
H13   11:00   15:00   12/2/2013 
H15   8:00    13:00   12/2/2013 

Таким образом, в таблице выше, как я могу написать запрос что скажут ... Дайте мне все заявки на 12/1/2013, которые НЕ, работающие с 17:00 до 18:00? Поэтому в основном он должен возвращать H12 & H13 (поскольку его временной интервал в 17-18 часов недоступен в таблице за 12/1/2013).

+0

Я не понимаю, что вы хотите, как результат. Вы говорите, что он должен возвращать H13, но вы хотите приложения для '12/1/2013', есть несогласованность. Также почему вы не используете полные DateTimes? – Lucio

+0

есть две записи для H13. один для 12/1/2013 –

+0

Lucio, я получаю данные от третьего лица в формате выше, я думаю, что могу написать собственный скрипт для добавления столбца DATE в StartTime и EndTime, но я не думаю, что это действительно могло бы помочь? H13, имеет несколько записей выше с разными датами. у него нет времени начала/окончания между 17: 00-18: 00 на 12/1/2013 – highwingers

ответ

1

Этот запрос возвращает идентификатор приложений, который не работал во временном диапазоне в определенную дату.

SELECT 
    [AppID] = FreeApps 
FROM table_name t1 
    WHERE AppID NOT IN (-- Not in the set of apps that were busy at the time range 
     SELECT AppID 
     FROM table_name t2 
      WHERE ((StartTime >= '17:00' AND StartTime <= '18:00') 
        OR (EndTime >= '17:00' AND EndTime <= '18:00')) 
       AND Date = '12/1/2013' 
       AND t1.AppID=t2.AppID) 
GROUP BY AppID 
+1

вам также нужно проверить дату 12/1/2013 –

+0

, и вам, скорее всего, также придется приложить отметки времени с помощью '. вам не кажется? –

+0

Спасибо за опечатку! О дате я действительно не знаю, что OP хочет в результате. – Lucio

1
;WITH t1 as 
(
SELECT DISTINCT AppID 
FROM <table> 
WHERE date = '20130112' 
) 
SELECT AppID 
FROM t1 
WHERE 
NOT EXISTS 
(SELECT * FROM <table> t2 
WHERE t2.STARTTIME < '18:00' 
AND t2.ENDTIME > '17:00' 
AND t1.AppID = t2.AppID 
AND t2.date = '20130112' 
)