본문 바로가기
SQL/MySQL

프로그래머스 LV 1. 오랜 기간 보호한 동물(2), DATEDIFF 함수

by 취준생 져니 2025. 4. 7.

🔗 문제 링크

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

🔍 문제 요약

- 입양 간 동물 중, 보호 기간이 길었던 동물 두마리를 출력하라

- 아이디와 이름을 출력

- 보호 기간이 긴 순으로 조회

 

 

✍️ 문제 풀이

처음 풀이는 이렇게 풀었는데...

SELECT ANIMAL_ID, NAME
FROM (SELECT O.ANIMAL_ID, O.NAME, 
      DATEDIFF(I.DATETIME, O.DATETIME) AS DATE
      FROM ANIMAL_INS I JOIN ANIMAL_OUTS O
      ON I.ANIMAL_ID = O.ANIMAL_ID
     ) AS R
ORDER BY DATE DESC

결과가 틀렸다고 나왔다,,, 😢

뭐가 문제인지 몰라서 찾아보았다

 

 

⚠️ 문제점

  1. SQL에서 DATE는 예약어이기 때문에 사용하면 오류가 발생함
    -> AS DATEDURATION으로 변경해줌

  2. DATEDIFF('A', 'B')를 사용하면 A - B 가 되는데 현재 코드를 보면
    DATEDIFF(I.DATETIME, O.DATETIME)로 보호 시작일 - 입양 시작일을 하고 있다.
    결과값이 화면과 같이 음수가 나옴

 

보호 기간을 구하기 위해서는 입양 시작일 - 보호 시작일을 해야 함
-> DATEDIFF(O.DATETIME, I.DATETIME) 으로 변경

 

  1. LIMIT 조건을 붙여줘야 함
    (문제 제대로 안 읽음)
    LIMIT 2를 붙여줘야 정답이라고 뜬다

 

최종 코드

SELECT ANIMAL_ID, NAME
FROM (SELECT O.ANIMAL_ID, O.NAME, 
      DATEDIFF(O.DATETIME, I.DATETIME) AS DURATION
      FROM ANIMAL_INS I INNER JOIN ANIMAL_OUTS O
      ON I.ANIMAL_ID = O.ANIMAL_ID
     ) AS R
ORDER BY DURATION DESC
LIMIT 2

 

어려운 문제는 아니었지만 실수를 많이 하는 거 같다,, 기본적인 것부터 공부 다시 해야할 거 같다

 

 

+ 다른 사람 코드 참조

  1. RANK() 함수 사용
    SELECT ANIMAL_ID, NAME
    FROM (
     SELECT O.ANIMAL_ID, O.NAME, 
            RANK() OVER(ORDER BY O.DATETIME - I.DATETIME DESC) AS DURATION
     FROM ANIMAL_INS I, ANIMAL_OUTS O
     WHERE I.ANIMAL_ID = O.ANIMAL_ID
     ORDER BY DURATION
     ) a
    WHERE DURATION IN (1,2)

 

아직 RANK 함수에 익숙하지 않아서 이걸 쓸 생각을 못했다😢
SQL 공부 열심히 해야겠다,,