오랜 기간 보호한 동물(2)
String, Date
오랜 기간 보호한 동물(2)
문제 설명
다음은 동물 보호소에 들어온 동물의 정보를 담은 ANIMAL_INS 테이블과 입양 보낸 동물의 정보를 담은 ANIMAL_OUTS 테이블입니다.
ANIMAL_INS 테이블
Column name | Type | Nullable | Description |
---|---|---|---|
ANIMAL_ID | VARCHAR(N) | FALSE | 동물의 아이디 |
ANIMAL_TYPE | VARCHAR(N) | FALSE | 생물 종 |
DATETIME | DATETIME | FALSE | 보호 시작일 |
INTAKE_CONDITION | VARCHAR(N) | FALSE | 보호 시작 시 상태 |
NAME | VARCHAR(N) | TRUE | 이름 |
SEX_UPON_INTAKE | VARCHAR(N) | FALSE | 성별 및 중성화 여부 |
ANIMAL_OUTS 테이블
Column name | Type | Nullable | Description |
---|---|---|---|
ANIMAL_ID | VARCHAR(N) | FALSE | 동물의 아이디 |
ANIMAL_TYPE | VARCHAR(N) | FALSE | 생물 종 |
DATETIME | DATETIME | FALSE | 입양일 |
NAME | VARCHAR(N) | TRUE | 이름 |
SEX_UPON_OUTCOME | VARCHAR(N) | FALSE | 성별 및 중성화 여부 |
문제
입양을 간 동물 중, 보호 기간이 가장 길었던 동물 두 마리의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 결과는 보호 기간이 긴 순으로 조회해야 합니다. ※ 입양을 간 동물이 2마리 이상인 경우만 입력으로 주어집니다.
풀이 과정
- JOIN으로 보호소 정보와 입양 정보 연결
ANIMAL_ID
기준으로 INNER JOIN하여 보호 시작일과 입양일을 함께 사용할 수 있도록 연결
- 보호 기간 계산
- 보호 기간은 입양일(
DATETIME
)에서 보호 시작일(DATETIME
)을 빼서 계산. 보호 기간은 날짜 간의 차이로 계산되므로 DATEDIFF 함수를 사용!!!
- 보호 기간은 입양일(
- 결과 정렬
- 정렬 기준에 따라 ORDER BY로 결과 정렬
- 보호 기간을 기준으로 내림차순 정렬한 후 LIMIT으로 상위 2개의 데이터를 가져오자
- 정렬 기준에 따라 ORDER BY로 결과 정렬
- 최종 결과 출력
- SELECT 절에서
ANIMAL_ID
,NAME
만 출력하자
- SELECT 절에서
- 교훈
- Oracle 보다 확실히 직관적이다. DATEDIFF.. MySQL에서는 (입양일 - 보호시작일 같은 직접적인 날짜 간 뺄셈은 불가능하다. 그러므로 DATEDIFF를 써줘야 함……. 별표 이백오십개
정답
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT
I.ANIMAL_ID,
I.NAME
FROM
ANIMAL_INS I
JOIN
ANIMAL_OUTS O
ON
I.ANIMAL_ID = O.ANIMAL_ID
ORDER BY
DATEDIFF(O.DATETIME, I.DATETIME) DESC,
I.ANIMAL_ID
LIMIT 2;
Tip
보호기간 = 입양일 - 보호시작일
- DATEDIFF 함수 : 두 날짜 간의 차이를 계산하여 보호 기간 구하기
개념 확인
- INNER JOIN
- 두 테이블 간의 공통된 데이터를 기준으로 결합
- ON 절에서 조건을 지정하여 결합할 기준을 명시
- DATEDIFF(date1, date2) 함수
- 두 날짜 간의 차이를 일 단위로 계산하는 함수.
- date1은 기준 날짜로, 더 미래의 날짜여야 양수 값이 반환됨
- date2는 비교할 과거의 날짜로 설정
- ex)
**DATEDIFF('2023-12-31', '2023-01-01')**은 **364**를 반환하여 두 날짜 간의 일 수 차이를 나타냄
- MySQL, Oracle 비교
- MySQL : 반드시 DATEDIFF(date1, date2)로 사용해야 함. MySQL에서 직접 날짜 간 뺄셈을 시도하면 오류가 발생!
- Oracle : 입양일 - 보호시작일 형태로 날짜 간 뺄셈이 바로 가능하고, 결과는 일 단위로 반환됩니다.
- ORDER BY와 LIMIT
- 결과를 보호 기간 기준으로 정렬한 후 상위 2개만 선택
Useful link
This post is licensed under Park Juyoung by the author.