2014-06-17 3 views
-4

시간이 걸리지 않는 시간대를 찾고 싶습니다. 예를 들어 은 주어진 다음의 표 :시간의 빈 공간 찾기

Table 1 

UserID   Start    End 

1  2014-06-02 09:00 2014-06-02 14:00 
2  2014-06-02 19:00 2014-06-02 21:00 
3  2014-06-02 20:00 2014-06-02 22:00 
4  2014-06-03 03:00 2014-06-03 08:00 
5  2014-06-03 13:00 2014-06-03 15:00 
6  2014-06-03 20:00 2014-06-03 23:00 
7  2014-06-03 23:00 2014-06-04 05:00 
8  2014-06-04 09:00 2014-06-04 13:00 


Expected result: 

Start       End 

2014-06-02 00:00  2014-06-02 09:00 
2014-06-02 14:00  2014-06-02 19:00 
2014-06-02 22:00  2014-06-03 00:00 
2014-06-02 00:00  2014-06-03 03:00 
2014-06-03 08:00  2014-06-03 13:00 
2014-06-03 15:00  2014-06-03 20:00 
2014-06-04 05:00  2014-06-04 09:00 
2014-06-04 13:00  2014-06-05 00:00 
+0

미안 해요, SQL에 익숙하지 않아요하지만 난 짓고 있어요 프로그램이 필요하므로, 어떠한 힌트 나 도움을 우리가하지 않을 – user3309825

+5

을 appriciated됩니다 모든 코드를 작성하십시오. 먼저 무엇인가 시험해보고, 특정한 문제가 생겼을 때 * 돌아와서 물어보십시오. –

+0

필자는 반드시 코드를 찾고 있지 않습니다. 어떤 힌트 또는 생각 과정이 멋질 것입니다. 왜냐하면 나는 갇혀 있거든요. – user3309825

답변

2

이 쿼리는 UNION 두 쿼리로 구성되어 있습니다. 첫 번째 방법은 모든 종료 날짜를 지정하고 다음 (MIN) 시작 날짜를 선택하는 것입니다. 데이터에 겹쳐진 간격이 있으므로 EXISTS 조건이 END 날짜를 제외해야합니다. 두 번째 쿼리는 첫 번째 줄을 얻는 것입니다. 하루의 시작부터 첫 번째 START 시간까지입니다.

SELECT * FROM 
(
SELECT End as Start, 
     COALESCE((SELECT MIN(Start) FROM T WHERE Start>T1.End), 
       DATE_ADD(DATE((SELECT MAX(END) FROM T)), INTERVAL 1 DAY) 
     ) as End 

FROM T as T1 
WHERE NOT EXISTS (SELECT * FROM T 
          WHERE T1.End 
           between Start and End 
           and UserID<>T1.UserID) 

UNION ALL 
SELECT DATE(MIN(START)) as Start, 
     MIN(START) as End 
FROM T 
) as T2 
ORDER BY Start 

SQLFiddle demo