
💻 코드
SELECT AI.ANIMAL_ID, AI.NAME
FROM ANIMAL_INS AI
JOIN ANIMAL_OUTS AO ON AI.ANIMAL_ID = AO.ANIMAL_ID
WHERE AI.DATETIME > AO.DATETIME
ORDER BY AI.DATETIME ASC;
📖 새로 배운 부분
- 지난번 "없어진 기록 찾기"는 한쪽 테이블에만 있는 데이터를 찾는 거라 LEFT JOIN이 필요했는데, 이번엔 입소 기록과 입양 기록이 둘 다 있는 동물끼리만 비교하면 되니까 그냥 JOIN(INNER JOIN)으로 충분했다.
- WHERE절에서 조인한 두 테이블의 날짜 컬럼을 바로 비교(AI.DATETIME > AO.DATETIME)할 수 있다는 걸 배웠다. 입양일이 입소일보다 빠른, 논리적으로 이상한 데이터를 이렇게 걸러낼 수 있었다.
💻 코드2 (DATEDIFF 활용)
SELECT AI.ANIMAL_ID, AI.NAME
FROM ANIMAL_INS AI
JOIN ANIMAL_OUTS AO ON AI.ANIMAL_ID = AO.ANIMAL_ID
WHERE DATEDIFF(AI.DATETIME, AO.DATETIME) > 0
ORDER BY AI.DATETIME ASC;
DATEDIFF(날짜1, 날짜2)는 날짜1에서 날짜2를 뺀 일(day) 수를 반환한다. 간단한 예로
SELECT DATEDIFF('2018-01-28', '2017-08-13'); -- 168
이렇게 첫 번째 날짜가 두 번째 날짜보다 며칠 늦은지를 숫자로 알려준다.
그래서 DATEDIFF(AI.DATETIME, AO.DATETIME) > 0은 "입소일이 입양일보다 며칠이라도 늦다(=입양일이 더 빠르다)"는
조건이 되어, 원래 코드의 AI.DATETIME > AO.DATETIME과 같은 역할을 한다.
다만 DATEDIFF는 날짜(연-월-일)만 비교하고 시:분:초는 무시한다는 점은 주의해야 한다. 입소일과 입양일이 같은 날짜이고 시간만 다른 경우에는 DATEDIFF 결과가 0이 되어버려서, 시간까지 비교하는 원래 코드와 결과가 달라질 수 있다.
이 문제처럼 시간까지 정확히 봐야 하는 경우엔 DATEDIFF보다 DATETIME 컬럼을 직접 비교하는 코드1이 더 안전하다.
⚠️ DATEDIFF vs TIMESTAMPDIFF, 계산 방향이 반대다
둘 다 날짜/시간 차이를 구하는 함수인데, 뺄셈 방향이 서로 반대라 헷갈리기 쉽다.
| 함수 | 계산 방식 |
| DATEDIFF(A, B) | A - B |
| TIMESTAMPDIFF(단위, A, B) | B - A (A에서 B까지 흐른 시간) |
SELECT DATEDIFF('2026-06-01', '2026-06-03'); -- -2 (A가 더 과거라서 음수)
SELECT TIMESTAMPDIFF(DAY, '2026-06-01', '2026-06-03'); -- 2 (A→B로 흐른 날짜라 양수)
한 줄로 정리하면: DATEDIFF는 첫 번째 인수에서 두 번째 인수를 빼고, TIMESTAMPDIFF는 반대로 두 번째 인수에서 첫 번째 인수를 뺀다(시작 → 끝까지 흐른 시간 개념).
참고
코딩테스트 연습 - 있었는데요 없었습니다
알고리즘 문제 연습 카카오톡 친구해요! 프로그래머스 교육 카카오 채널을 만들었어요. 여기를 눌러, 친구 추가를 해주세요. 신규 교육 과정 소식은 물론 다양한 이벤트 소식을 가장 먼저 알려
school.programmers.co.kr
'코테 > MySQL' 카테고리의 다른 글
| [프로그래머스, SQL] 보호소에서 중성화한 동물 (0) | 2026.08.02 |
|---|---|
| [프로그래머스, SQL] 오랜 기간 보호한 동물(1) (0) | 2026.08.02 |
| [프로그래머스, SQL] 없어진 기록 찾기 (0) | 2026.08.02 |
| [프로그래머스, SQL] 조건에 맞는 도서와 저자 리스트 출력하기 (0) | 2026.08.02 |
| [프로그래머스, SQL] 흉부외과 또는 일반외과 의사 목록 출력하기 (0) | 2026.08.02 |