PS/SQL
[SQL] 자동차 대여 기록에서 장기/단기 대여 구분하기
행복한라이언
2024. 2. 6. 14:09
728x90
반응형
문제링크
https://school.programmers.co.kr/learn/courses/30/lessons/151138
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1. 핵심
- 오늘 빌려가서 오늘 반납하는 경우: 대여일은 1일이다.
- END_DATE - START_DATE + 1 >= 30
- IF문: 조건에 따라 값을 반환하는 함수
- IF(condition, value_if_true, value_if_false)
- condition - 참과 거짓 판단
- valut_if_true: 참일 때 반환하는 값 / value_if_false: 거짓일 때 반환하는 값
- TIMESTAMPTDIFF문: 두 날짜 사이의 차이를 계산하는데 사용
- timestampdiff(unit, datetime_expr1, datetime_expr2)
- unit: 반환되는 차이의 단위 ex) second(초) / minute(분) / hour(시간) / day(일) / week(주) / month(월) / year(연) / quarter(분기)
- datetime_expr1 (상대적) 이른 날
- datetime_expr2 (상대적) 늦은 날
- CASE문
- CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
WHEN conditionN THEN resultN
ELSE default_result
END - CASE: CASE문의 시작
- WHEN condition THEN result: 조건이 만족할 때 해당 결과 반환
- ELSE default_result: 모든 조건이 만족되지 않았을 때 반환되는 기본 결과
- END: CASE문의 끝
- CASE
2. 코드(MySQL)
select HISTORY_ID, CAR_ID,
date_format(START_DATE, '%Y-%m-%d'),
date_format(END_DATE, '%Y-%m-%d'),
# 오늘 빌려서 오늘 반납(END_DATE = START_DATE)
# 대여기간 1일 = END_DATE - START_DATE + 1
if((timestampdiff(DAY, START_DATE, END_DATE) + 1)>=30,
'장기 대여','단기 대여') as RENT_TYPE
from CAR_RENTAL_COMPANY_RENTAL_HISTORY
where month(START_DATE) = 9
order by HISTORY_ID desc;
SELECT HISTORY_ID, CAR_ID,
DATE_FORMAT(START_DATE, '%Y-%m-%d'),
DATE_FORMAT(END_DATE, '%Y-%m-%d'),
CASE
WHEN TIMESTAMPDIFF(DAY, START_DATE, END_DATE) + 1 >= 30 THEN '장기 대여'
ELSE '단기 대여'
END AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE MONTH(START_DATE) = 9
ORDER BY HISTORY_ID DESC;
3. 활용예제
SELECT TIMESTAMPDIFF(SECOND, '2022-01-01 12:00:00', '2022-01-01 12:00:10');
-- 결과: 10 (초)
SELECT TIMESTAMPDIFF(MINUTE, '2022-01-01 12:00:00', '2022-01-01 12:10:00');
-- 결과: 10 (분)
SELECT TIMESTAMPDIFF(HOUR, '2022-01-01 12:00:00', '2022-01-01 15:00:00');
-- 결과: 3 (시간)
SELECT TIMESTAMPDIFF(DAY, '2022-01-01', '2022-01-10');
-- 결과: 9 (일)
SELECT TIMESTAMPDIFF(WEEK, '2022-01-01', '2022-01-21');
-- 결과: 2 (주)
SELECT TIMESTAMPDIFF(MONTH, '2022-01-01', '2022-04-01');
-- 결과: 3 (월)
SELECT TIMESTAMPDIFF(QUARTER, '2022-01-01', '2023-07-01');
-- 결과: 7 (분기)
SELECT TIMESTAMPDIFF(YEAR, '2022-01-01', '2025-01-01');
-- 결과: 3 (년)
CASE
WHEN age < 18 THEN '미성년자'
WHEN age >= 18 AND age < 65 THEN '성인'
ELSE '노인'
END AS age_group
728x90
반응형