2013-09-25 5 views
0

У меня возникли проблемы с суммированием разницы дат (в минутах) между перекрывающимися датами, используя второй набор дат, как больше «маски».Подведение «замаскированных» диапазонов дат-времени с использованием перекрывающихся дат в SQL Server

ЧТО Я ИМЕЮ

Моя таблица может выглядеть следующим образом:

ID   StartDateTime   EndDateTime   Type 
1   9-16-2013 12:00:00  9-16-2013 16:00:00  A  
2   9-16-2013 12:00:00  9-16-2013 13:00:00  A 
3   9-16-2013 14:00:00  9-16-2013 15:00:00  A 
4   9-16-2013 12:00:00  9-16-2013 13:00:00  C 
5   9-16-2013 14:00:00  9-16-2013 17:00:00  C 

визуальный график будет выглядеть следующим образом:

 12  13  14  15  16  17 
A  |-------------------------------|     (ID 1) 
A  |-------|  |-------|       (IDs 2 and 3) 
C  |-------|  |-----------------------| 

ЧТО МНЕ НУЖНО

Что мне нужно сделать, это ввести сумму А, если типа B. Поэтому множество Я ищу для создания и сумма (ID включено для справки):

ID   StartDateTime   EndDateTime 
1   9-16-2013 12:00:00  9-16-2013 13:00:00 
1   9-16-2013 14:00:00  9-16-2013 16:00:00 
2   9-16-2013 12:00:00  9-16-2013 13:00:00 
3   9-16-2013 14:00:00  9-16-2013 15:00:00 

Новая «замаскированы» хронология будет выглядеть это:

 12  13  14  15  16  17 
A  |-------|  |---------------|     (ID 1) 
A  |-------|  |-------|       (ID 2 and 3) 

проблема, которую я имею раскалывается первый идентификатор в 2-х различных записей из-за перерыва в типа C. Я смотрел на много постов перекрытия на этом сайте, но никто, кажется, для удовлетворения этой конкретной потребности. Любая помощь будет принята с благодарностью. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация или я могу быть яснее в любом случае. Я использую SQL Server 2008 R2.

+0

Ваш вопрос остается неясным, где час от 13 до 14 лет 1 ID? – Justin

ответ

1

Одно из возможных решений:

--set up test data 
DECLARE @t TABLE 
(ID INT,StartDateTime DATETIME,EndDateTime DATETIME,[Type] CHAR(1)) 

INSERT @t 
(ID,StartDateTime,EndDateTime,[Type]) 
VALUES 
(1,'9-16-2013 12:00:00','9-16-2013 16:00:00','A'), 
(2,'9-16-2013 12:00:00','9-16-2013 13:00:00','A'), 
(3,'9-16-2013 14:00:00','9-16-2013 15:00:00','A'), 
(4,'9-16-2013 12:00:00','9-16-2013 13:00:00','C'), 
(5,'9-16-2013 14:00:00','9-16-2013 17:00:00','C') 

-- solution 
SELECT a.Id, 
     CASE WHEN a.StartDateTime < c.StartDateTime THEN c.StartDateTime ELSE a.StartDateTime END AS StartDateTime, 
     CASE WHEN a.EndDateTime < c.EndDateTime THEN a.EndDateTime ELSE c.EndDateTime END AS EndDateTime, 
     a.[Type] 
FROM (SELECT * FROM @t WHERE [Type] = 'A') AS a 
JOIN (SELECT * FROM @t WHERE [Type] = 'C') AS c 
ON  c.StartDateTime < a.EndDateTime 
AND  c.EndDateTime > a.StartDateTime 
ORDER BY a.Id, a.StartDateTime 
+0

Это именно то, что я искал. Мне нужно было добавить дату diff и суммирование, а также некоторые из них - null-проверки, но решение Ed отлично работало по тому, что я просил. –

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