1. 풀이 방법 (DATE_ADD)
SELECT
dt1.measured_at AS today,
dt2.measured_at AS next_day,
dt1.pm10 AS pm10,
dt2.pm10 AS next_pm10
FROM measurements as dt1
JOIN measurements as dt2
ON dt2.measured_at = DATE_ADD(dt1.measured_at, INTERVAL 1 DAY)
WHERE dt1.pm10 < dt2.pm10
2. POINT
해당 문제에서는 SELF JOIN을 사용해서 문제를 풀었습니다
JOIN의 조건인 ON에서 DATE_ADD를 사용했는데요
ON dt2.measured_at = DATE_ADD(dt1.measured_at, INTERVAL 1 DAY) --dt1의 다음날과 매칭
이 쿼리는 dt1의 measured_at에 하루 더한 값이 dt2에 실제로 있을 경우에 매칭이 된다는 의미입니다
그래서 쿼리를 실행하면 당일과 다음날이 있는 경우가 매칭이 되어 한 행에 위치할수 있는거죠
추가적으로 테이블의 마지막 날짜는 다음날이 없기 때문에 JOIN의 종류에 따라 다르게 출력됩니다.
- INNER JOIN(지금처럼 JOIN): 마지막 날은 매칭 자체가 안 되므로 결과에 “행이 없음”. NULL이 아니라 아예 안 나옵니다.
- LEFT JOIN(왼쪽이 t1): 마지막 날은 t1은 나오고, t2 쪽 컬럼들이 NULL로 채워집니다.

3. DATE_ADD : 날짜/시간의 간격을 더하는 함수
1) 기본 문법
DATE_ADD(datetime_expr, INTERVAL n unit)
-- 같은 의미의 별칭: ADDDATE(datetime_expr, INTERVAL n unit)
- datetime_expr: DATE 또는 DATETIME/TIMESTAMP
- n: 정수(음수도 가능)
- unit: 간격 단위
2) 자주 쓰는 단위
| UNIT | 의미 | 예시 |
| SECOND, MINUTE, HOUR | 초/분/시간 | DATE_ADD(NOW(), INTERVAL 3 HOUR) |
| DAY, WEEK | 일/주 | DATE_ADD('2025-10-11', INTERVAL 7 DAY) |
| MONTH, QUARTER, YEAR | 월/분기/년 | DATE_ADD('2025-01-31', INTERVAL 1 MONTH) |
| MICROSECOND | 마이크로초 | DATE_ADD(NOW(), INTERVAL 500000 MICROSECOND) |
예시)
-- 내일
SELECT DATE_ADD(CURDATE(), INTERVAL 1 DAY);
-- 3시간 후
SELECT DATE_ADD(NOW(), INTERVAL 3 HOUR);
-- 2개월 전
SELECT DATE_ADD(CURDATE(), INTERVAL -2 MONTH); -- 또는 DATE_SUB(CURDATE(), INTERVAL 2 MONTH)
-- 분기에 1분기 더하기
SELECT DATE_ADD('2025-04-15', INTERVAL 1 QUARTER);
'코딩 테스트 > 02. SQL' 카테고리의 다른 글
| [solvesql]MySQL_2(Lv2) (1) | 2025.10.12 |
|---|---|
| [solvesql_Lv2] 제목이 모음으로 끝나지 않는 영화 (0) | 2025.10.12 |
| [solvesql]MySQL_1 (Lv_2) (0) | 2025.10.11 |
| [프로그래머스]Oracle SQL_7(Lv4) (0) | 2025.10.04 |
| [프로그래머스]Oracle SQL_6(Lv4)/UNION ALL과 CONNECT BY (0) | 2025.10.03 |