몸과 마음이 건전한 SW 개발자

프로그래머스 SQL 고득점 Kit Lv 1 String, Date 2 문제 모음 본문

SQL

프로그래머스 SQL 고득점 Kit Lv 1 String, Date 2 문제 모음

스위태니 2023. 12. 30. 17:55

1. 자동차 대여 기록에서 장기/단기 대여 구분하기

https://school.programmers.co.kr/learn/courses/30/lessons/151138

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

정답 코드 1

SELECT
    HISTORY_ID,
    CAR_ID,
    DATE_FORMAT(START_DATE, "%Y-%m-%d") AS START_DATE,
    DATE_FORMAT(END_DATE, "%Y-%m-%d") AS END_DATE,
    IF (DATEDIFF(END_DATE, START_DATE) + 1 >= 30, "장기 대여", "단기 대여") AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE LIKE "2022-09%"
ORDER BY HISTORY_ID DESC;

정답 코드 2

SELECT
    HISTORY_ID,
    CAR_ID,
    DATE_FORMAT(START_DATE, "%Y-%m-%d") AS START_DATE,
    DATE_FORMAT(END_DATE, "%Y-%m-%d") AS END_DATE,
    CASE
        WHEN DATEDIFF(END_DATE, START_DATE) + 1 >= 30 
        THEN '장기 대여'
        ELSE '단기 대여'
    END AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE MONTH(START_DATE) = 9 AND YEAR(START_DATE) = 2022
ORDER BY HISTORY_ID DESC;

Key Point

DATEDIFF 함수

문법 : DATEDIFF(date1, date2)

설명 :

  • DATEDIFF 함수는 date1에서 date2를 뺀 결과를 일 단위로 반환합니다. 반환되는 값은 정수이며, date1이 date2보다 이후 날짜일 경우 양수, 그보다 이전 날짜일 경우 음수가 됩니다.
  • 결과는 두 날짜 사이의 전체 일수 차이를 나타냅니다. 즉, date1과 date2 사이에 몇 일이 있는지 알려줍니다.

예시 : 

  • SELECT DATEDIFF('2023-12-25', '2023-12-01') AS DaysDifference;
    • 이 쿼리는 2023년 12월 25일과 12월 1일 사이의 일수 차이를 계산합니다. 결과는 24일이 됩니다.
    • 하지만 단순히 몇 일 차이가 나는지 구하는 문제가 아니라 몇 일 동안 대여했는지를 나타내야 하기 때문에 뺀 값에서 +1을 해주는 것이 포인트다.

CASE 구문

문법 :

  1. 단순 CASE 구문:
    • expression은 평가될 표현식입니다.
    • value1, value2, ...은 expression과 비교될 값입니다.
    • result1, result2, ...은 각 경우에 반환될 결과입니다.
CASE expression
    WHEN value1 THEN result1
    WHEN value2 THEN result2
    ...
    ELSE resultN
END
  1. 검색 CASE 구문 (여기서 사용된 형태):
    • condition1, condition2, ...은 참이나 거짓으로 평가될 조건입니다.
    • result1, result2, ...은 각 조건에 대해 반환될 결과입니다.
CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    ...
    ELSE resultN
END

예시 : 

SELECT
    EmployeeID,
    CASE DepartmentID
        WHEN 1 THEN 'IT'
        WHEN 2 THEN 'HR'
        ELSE 'Unknown'
    END AS DepartmentName
FROM Employees;

이 쿼리는 각 직원의 부서 ID에 따라 부서 이름을 반환합니다.

 

2. 특정 옵션이 포함된 자동차 리스트 구하기

https://school.programmers.co.kr/learn/courses/30/lessons/157343

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

SELECT
    CAR_ID,
    CAR_TYPE,
    DAILY_FEE,
    OPTIONS
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS LIKE "%네비게이션%"
ORDER BY CAR_ID DESC;