2017-04-03 2 views
0

나는 다음과 같은 테이블 구조가 있습니다의 MySQL TIMESTAMPDIFF 합

+----+---------------------+---------------------+ 
| id | created_at   | closed    | 
+----+---------------------+---------------------+ 
| 1 | 2017-04-03 04:00:00 | 2017-04-03 04:30:00 | 
| 2 | 2017-04-03 04:25:00 | 2017-04-03 04:35:00 | 
+----+---------------------+---------------------+ 

내 실제 SQL 쿼리에서 내가 timestap 필드에 두 날짜 사이의 diffirence을 clacualte하는 timestampdiff를 사용합니다. 이 diffirent 시간 간격으로 시작 ctreated_at 및 모든 레코드의 closed_at 경우 아무런 문제가 없다, 그래서 나는 모든 행에 소요 시간을 얻을 수 다음 것 같이

SELECT SUM(timestampdiff(SECOND, created_at, closed_at)) as TotalTime FROM table 

내 문제가 위의 표시 테이블처럼, 시간을 간격 교차. 위의 쿼리는 900을 발생합니다하지만 나는 같은 것을 시도 600

이 있어야합니다 결과는

SELECT timestampdiff(
        MINUTE, 
        a.created_at, 
        (SELECT max(b.closed) from times as b WHERE b.created_at < a.closed) 
        ) as periods 
FROM `times` as a 

을 :

여기
+---------+ 
| periods | 
+---------+ 
|  35 | 
|  10 | 
+---------+ 

내가를 represnts whuch 첫 번째 결과를 원하는 겹쳐진 기간의 순 시간. 이전 쿼리와 MAX를 사용해야 첫 번째 레코드를 반환하지만 futere에 추가 된 다른 기간 그룹 테이블하게되어 방치로 이어질 것입니다 :

+----+---------------------+---------------------+ 
| id | created_at   | closed    | 
+----+---------------------+---------------------+ 
| 1 | 2017-04-03 04:00:00 | 2017-04-03 04:30:00 | 
| 2 | 2017-04-03 04:25:00 | 2017-04-03 04:35:00 | 
| 3 | 2017-04-03 05:00:00 | 2017-04-03 05:15:00 | 
+----+---------------------+---------------------+ 

위의 쿼리 반환 :

+---------+ 
| periods | 
+---------+ 
|  35 | 
|  10 | 
|  15 | 
+---------+ 

다시에게 여기서는 첫 번째 기록에서 이전에 계산 된 기간을 설명하기 때문에 두 번째 기록을 원하지 않습니다. 실제로 MySQL에서는 위의 예에서 두 개의 레코드 또는 세 개의 레코드 만 가져올 수 있지만 두 번째는 null, 0, 음수 값 등이 다른 실제 값과 구별되도록하는 것은 가능하지 않습니다.

+0

mysql에서는 불가능하다고 생각합니다. –

답변

0

시간당 기준으로 시간대를 지정하고 최대 시간을 기준으로 그룹을 수행해야합니다.

SELECT max(timestampdiff(
        MINUTE, 
        a.created_at,closed) as periods 
FROM `times` as a group by hour(created_at) 

이제 ur 요구 사항에 따라 결과가 표시됩니다.

+1

이 솔루션은 작동하지만 첫 번째 시간과 동일한 시간에 다른 독립 간격이 발생할 때 제한이 있습니다. 테이블의 세 번째 행에 'created_at' 값이'2017-04-03 04 : 55 : 00'으로 있다고 가정합니다. – SaidbakR

+0

그 시점에서 무엇을 얻고 싶습니까? – Rams

+0

그것은 지정된 시간에 국한되지 않고, 아이디어는 이벤트 로그 테이블과 비슷하며 기간이 겹치는 이벤트 및 다른 독립 기간에 하위 기간이 있는지 여부를 결정하고자합니다. @ 램스 – SaidbakR