본문 바로가기
PS/SQL

[SQL] 자동차 대여 기록에서 장기/단기 대여 구분하기

by 행복한라이언 2024. 2. 6.
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문의 끝

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
반응형