2015-02-18 9 views
0

Меня попросили сделать sql-серверный запрос, где мне нужно удалить Период времени перекрытия между служебными билетами. Подобно тому, как у нас есть служба, которая сталкивается с 3-мя различными проблемами в одно и то же время. Название таблицы: билет, и в нем есть n-количество билетов, из которых меня интересуют эти 3, так как они принадлежат к одной и той же услуге.Удалить время перекрытия в SQL Server 2008

Ticket Number Start Time End Time 1 11:00 15:00 2 12:00 13:00 3 14:00 16:00

мне нужен запроса, чтобы вычислить общее время простоя во время этих билетов были активно, что на 6 часов (11: 00-16: 00).

Что делать?

+0

SUM (конец времени - начало времени) ... (возможно, группа слишком) – jarlh

+0

Не работает. Он показывает, что SUM не работает в datetime datatype –

+0

Вам нужно как-то получить тип данных интервала, проверить документацию! – jarlh

ответ

0

Вы можете использовать DATEDIFF и SUM функции вместе:

SELECT DATEDIFF(HOUR, MIN([Start Time]),MAX([End Time]))AS [total downtime] 
FROM tblTicketTable 
WHERE [Ticket Number] = 1 OR [Ticket Number] = 2 OR [Ticket Number] = 3 
+0

это дает мне полный простоя, который является ** Перекрытием ** Билет 1 - 4 часа, билет 2 1 час, билет 3 - 2 часа. Согласовано. Если мы вычислим его отдельно, каждый билет занимает 7 часов. Но через день служба была отключена с 11:00 до 16:00, что составляет 5 часов. Я надеюсь, что вы получаете мою точку –

+0

@FarhaanAli, пожалуйста, проверьте, что я отредактировал свой ответ – Bayeni

+0

Спасибо LOT sir :) –

0

Если вы создаете таблицу (или просмотр, или UDF, или декартовое объединение, либо рекурсивный CTE), который генерирует все 1440 раз в день при детализации на уровне минут {00: 00..23: 59}, вы можете присоединитесь к своим билетам и используйте счет отдельных минут для расчета продолжительности билета. Когда участвует группа билетов, подсчитывайте количество отдельных минут, чтобы избежать двойного счета минут в любых перекрывающихся диапазонах.

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

SELECT COUNT(DISTINCT t.ticketnumber) AS ticketcount, 
    COUNT(DISTINCT m.timeval) AS totalminutes 
FROM ticketTbl t 
INNER JOIN timeList m 
ON t.startTime <= m.timeval 
AND t.endTime > m.timeval 
WHERE t.ticketnumber IN (1, 2, 3) 
; 
Смежные вопросы