2013-09-25 3 views
0

두 번째 datetimes 집합을 "마스크"로 사용하여 겹치는 날짜 시간의 날짜 차이 (분)를 합산하는 데 문제가 있습니다.SQL 서버에서 중복되는 datetimes를 사용하여 "masked"datetime 범위를 합산합니다.

나는

내 표는이 같은 보일 수 있습니다 무엇을 :

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  |-------|  |-----------------------| 

을 내가 필요로 무엇을

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 

새로운 "마스크"타임 라인과 같습니다 내가해야 할 일은타입 B.에게 내가 생성하기 위해 찾고 있어요 및 합계 인 세트 (ID는 참조 용으로 포함) 그래서 경우에만 합 A 형이다 이 :

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

나는 때문에이 사이트에 중복 게시물의 많은 검토 한 타입 C에서 휴식의 2 개 개의 다른 기록에 최초의 ID 분할되는 데 문제지만, 아무도가 보인다 이 특별한 필요를 해결합니다. 어떤 도움이라도 대단히 감사하겠습니다. 더 많은 정보가 필요하거나 어떤 식 으로든 더 명확해질 수 있다면 알려주십시오. SQL Server 2008 R2를 사용하고 있습니다.

+0

귀하의 질문에, 불분명 경우 13 일 개 ID의 14 시간은? – 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

이것은 정확히 내가 찾던 것이었다. 나는 날짜 비교와 합계를 추가 할 필요가 있었고, 일부는 null 체크 였지만, 에드의 솔루션은 내가 요청한 것을 완벽하게 처리했다. –