HAZEL

[ SQL : 날짜 빼기, TIMESTAMPDIFF, DATEDIFF] 프로그래머스 오랜 기간 보호한 동물(2) 본문

DATA ANALYSIS/SQL

[ SQL : 날짜 빼기, TIMESTAMPDIFF, DATEDIFF] 프로그래머스 오랜 기간 보호한 동물(2)

Rmsid01 2021. 10. 16. 23:55

프로그래머스 오랜 기간 보호한 동물(2)

 

>> 문제 

 

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다. ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다. ANIMAL_OUTS 테이블의 ANIMAL_ID는 ANIMAL_INS의 ANIMAL_ID의 외래 키입니다. 입양을 간 동물 중, 보호 기간이 가장 길었던 동물 두 마리의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 기간이 긴 순으로 조회해야 합니다.

 

 

>> 정답 코드

: 아래에서는 TIMESTAMPDIFF의 개념과 서브쿼리를 이용하여 문제를 풀었다.

SELECT ad.ANIMAL_ID, ad.NAME
FROM (SELECT ins.ANIMAL_ID, ins.NAME, TIMESTAMPDIFF(day, ins.DATETIME, outs.DATETIME  ) as diff
    FROM ANIMAL_INS ins
    LEFT JOIN ANIMAL_OUTS outs ON ins.ANIMAL_ID = outs.ANIMAL_ID
    ORDER BY diff DESC
    LIMIT 2) ad

사용된 개념 : TIMESTAMPDIFF

 

>> 다른사람이 푼 코드

: DATE, TIME 관련 함수를 사용하지 않고 단순히 - 을 이용하였다. 또한, ORDER BY 절에 넣음으로써, 서브쿼리를 이용하지 않았다.

: 물론, ORDER BY 절에 위의 DATE관련 함수를 사용해서 빼도 가능하다. ORDER BY 에 바로 사용할 수 있다는 점을 생각하면 좋을 것같다.

SELECT OUTS.ANIMAL_ID, OUTS.NAME
FROM ANIMAL_INS INS RIGHT OUTER JOIN ANIMAL_OUTS OUTS
ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
ORDER BY OUTS.DATETIME - INS.DATETIME DESC
LIMIT 2;

날짜의 차이를 나타내는 방법 

: 날짜의 차이를 방법으로는 여러가지가 존재한다. 

 

1)  TIMEDIFF( 시간1, 시간2 )

: 원하는 데이터타입의 시간을 넣어준다. 시간1 - 시간2  로 데이터의 계산이 진행된다.  

SELECT ins.ANIMAL_ID, ins.NAME,  TIMEDIFF(outs.DATETIME, ins.DATETIME)
FROM ANIMAL_INS ins
    LEFT JOIN ANIMAL_OUTS outs ON ins.ANIMAL_ID = outs.ANIMAL_ID
LIMIT 4

 

 

2) DATEDIFF( 날짜1, 날짜2 )

: 원하는 데이터의 타입의 '날짜'를 넣어준다. 날짜1 - 날짜 2 로 계산이 진행된다.

아래의 데이터를 보면 위의  TIMEDIFF와의 차이점을 볼수 있다. 위에는 시간의 뺄셈이 나오고, 아래는 날짜(일)의 차이가 나온다.

SELECT ins.ANIMAL_ID, ins.NAME,  DATEDIFF(outs.DATETIME, ins.DATETIME)
FROM ANIMAL_INS ins
    LEFT JOIN ANIMAL_OUTS outs ON ins.ANIMAL_ID = outs.ANIMAL_ID
LIMIT 4

 

3) TIMESTAMPDIFF( '결과값 형식'. '날짜1'. '날짜2')

: 이 함수는 모든 시간에 대한 차이를 계산하는 함수이다. 위에서 언급한 2개와는 다르게, 내부적으로 계산하는 순서가 다르다. '날짜2' - '날짜1' 로 내부적으로 계산된다. 

 

- DATE_FORMAT을 넣어준 이유는, 데이터타입이 아닐경우 타입을 맞춰주기 위해서 넣어준다.

SELECT ins.ANIMAL_ID, ins.NAME,  TIMESTAMPDIFF(day, DATE_FORMAT(ins.DATETIME,"%Y-%m-%d"),  DATE_FORMAT(outs.DATETIME,"%Y-%m-%d")) TIMESTAMPDIFF
FROM ANIMAL_INS ins
    LEFT JOIN ANIMAL_OUTS outs ON ins.ANIMAL_ID = outs.ANIMAL_ID
LIMIT 4

 

- 결괏값 형식이란 뺄셈을 한 결과에 대해 원하는 단위를 입력하면 된다.

 

  • SECOND : 초
  • MINUTE : 분
  • HOUR : 시
  • DAY : 일
  • WEEK : 주
  • MONTH : 월
  • QUARTER : 분기
  • YEAR : 연