2016-11-21 1 views
0

모르겠어요 전에 기록 후 N 일 동안 생성 된 가장 최근의 기록을 내가 만약 내가 현재 날짜를 필요MySQL의 -이 여기에 가능 여부를하지만, 경우는

찾고 있어요 무엇 생성 된 마지막 레코드가 N 일 이상되었거나 이전에 생성 된 첫 번째 레코드의 created_at 날짜 이후 N 일 동안 생성 된 첫 번째 레코드의 created_at

따라서 생성 날짜가 차이가 N 일보다 크고 그 두 날짜 사이에 다른 레코드가 생성되지 않은 경우 모든 레코드의 가장 최근 created_at가 N 일 전보다 더 큰 경우를 제외하고 가장 최근에 만들어진 레코드의 created_at를 제공합니다. 테 대신

때문에이 표 및 N = 5 내가 6 days ago하지만 13 days ago 또는 5 days ago를 얻을 필요가

+----+-------------+ 
|id |created_at | 
+----+-------------+ 
|9 |1 day ago | 
|8 |2 days ago | 
|7 |3 days ago | 
|6 |4 days ago | 
|5 |5 days ago | < not this date 
|4 |6 days ago | < get this date 
|3 |12 days ago | < not this date 
|2 |13 days ago | < not this date 
|1 |20 days ago | 
+----+-------------+ 

을 주어 기록이

+----+-------------+ 
|id |created_at | 
+----+-------------+ 
|5 |11 day ago | < not this date, instead today's date 
|4 |12 days ago | 
|3 |20 days ago | 
|2 |21 days ago | 
|1 |30 days ago | 
+----+-------------+ 

처럼 보였다 경우 오늘 날짜가 필요합니다

+0

은'created_at '날짜 또는 말 그대로 "11 일 전"? – WillardSolutions

+0

날짜가 맞습니다. X 일 전 예를 들어 읽기가 더 쉬웠다 고 생각했습니다. – Jarfis

+0

날짜가 1,2,5,6,7,15 일 전인 경우 15 일 전에 차이가 있어야하기 때문에 N 일보다? – Barmar

답변

1

인접한 날짜 간의 차이를 계산하는 쿼리로 시작하십시오.

SELECT created_at, DATEDIFF(@prevdate, created_at) AS diff, @prevdate := created_at 
FROM (SELECT created_at 
     FROM yourTable 
     WHERE created_at <= DATE_SUB(CURDATE(), INTERVAL @N DAY) 
     ORDER BY created_at DESC) AS x, 
CROSS JOIN (SELECT @prevdate := NULL) as vars 

그런 다음 diff 이상 N 행 (row)에 대한 필터를 추가하고, 가장 최근의 날짜가 이상 N일 경우 현재 날짜를 얻기 위해, 마지막으로이

SELECT MAX(created_at) AS selected_date 
FROM (SELECT created_at, DATEDIFF(@prevdate, created_at) AS diff, @prevdate := created_at 
     FROM (SELECT created_at 
      FROM yourTable 
      WHERE created_at <= DATE_SUB(CURDATE(), INTERVAL @N DAY) 
      ORDER BY created_at DESC) AS x 
     CROSS JOIN (SELECT @prevdate := NULL) as vars) AS z 
WHERE diff > @N; 

의 가장 최근을 선택 예전에 가장 최근의 날짜를 가져 오는 다른 쿼리에 참여하고 IF()을 사용할 수 있습니다.

SELECT IF (latest_date < DATE_SUB(CURDATE(), INTERVAL @N DAY), CURDATE(), MAX(created_at)) AS selected_date 
FROM (SELECT created_at, DATEDIFF(@prevdate, created_at) AS diff, @prevdate := created_at 
    FROM (SELECT created_at 
      FROM yourTable 
      WHERE created_at <= DATE_SUB(CURDATE(), INTERVAL @N DAY) 
      ORDER BY created_at DESC) AS x 
    CROSS JOIN (SELECT @prevdate := NULL) as vars) AS z 
CROSS JOIN (SELECT MAX(created_at) AS latest_date FROM yourTable) AS y 
WHERE diff > @N; 

DEMO

+0

나는 이것이 내가 찾고있는 것이라고 생각하지 않는다. 그냥 N 일 넘은 가장 최근 레코드보다 새로운 첫 번째 레코드의 created_at를 반환하지 않을까? – Jarfis

+1

그것이 당신이 요구 한 것이 었습니다.하지만 제가 게시 한 이후 당신이 질문을 변경 한 것처럼 보입니다. – Barmar

+0

죄송합니다. 예제에서 첫 번째 패스가 충분하지 않습니다. – Jarfis

0

나는

SELECT IF (latest_date < DATE_SUB(CURDATE(), INTERVAL @N DAY), CURDATE(), MAX(fetch_prevdate)) AS selected_date 
FROM (SELECT created_at, @prevdate as fetch_prevdate, DATEDIFF(@prevdate, created_at) AS diff, @prevdate := created_at 
     FROM (SELECT created_at 
      FROM yourTable 
      WHERE created_at <= DATE_SUB(CURDATE(), INTERVAL @N DAY) 
      ORDER BY created_at DESC) AS x 
     CROSS JOIN (SELECT @prevdate := NULL) as vars) AS z 
CROSS JOIN (SELECT MAX(created_at) AS latest_date FROM yourTable) AS y 
WHERE diff > @N; 

갔다 Barmar의 대답이었다 내가 필요하지만 이전 @prevdate 값을 저장 날짜 차이 하위 쿼리에 필드를 추가 한 무슨의 99 %와 같은 그것은 선택에서 더 이상 재 할당되었고 created_at 필드 대신 MAX 필드를 받았습니다