문제 : 

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일이 2022년 9월에 속하는 대여 기록에 대해서 대여 기간이 30일 이상이면 '장기 대여' 그렇지 않으면 '단기 대여' 로 표시하는 컬럼(컬럼명: RENT_TYPE)을 추가하여 대여기록을 출력하는 SQL문을 작성해주세요. 결과는 대여 기록 ID를 기준으로 내림차순 정렬해주세요.

 

문제 해결 방식 :

-- WHERE 에서 대여 시작일 2022년 9월
-- CASE WHEN 으로 대여기간 30일 이상 >= 30 '장기대여' / 아니면 '단기 대여' >> 컬럼 RENT_TYPE 
-- ORDER BY 대여 기록 ID DESC 

 

사용 함수 : DATE_FORMAT, CASE WHEN, MONTH

결과 : 틀림

 

SELECT TB.*
FROM(
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) >= 30 THEN '장기대여'
               ELSE '단기대여' END AS RENT_TYPE
from CAR_RENTAL_COMPANY_RENTAL_HISTORY) TB
WHERE MONTH(TB.START_DATE) = 09
ORDER BY 1 DESC

 

틀린 이유 : 빌린 당일날 반납한 것은 1일 대여한 것으로 쳐야 함.. 30을 29로 바꾸니 정답 확인

SELECT TB.*
FROM(
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) >= 29 THEN '장기 대여'
               ELSE '단기 대여' END AS RENT_TYPE
from CAR_RENTAL_COMPANY_RENTAL_HISTORY) TB
WHERE MONTH(TB.START_DATE) = 09
ORDER BY 1 DESC

 

 

다른 풀이법 : 

1. WHERE 을  다르게 사용 

WHERE START_DATE LIKE '2022-09%'
WHERE YEAR(START_DATE) = 2022 AND MONTH(START_DATE) = 9

 

 

* DATEDIFF 

   두 날짜 간의 차이를 단순히 일(day) 단위로 계산

 

* TIMESTAMPDIFF 사용

   - YEAR 

   - MONTH 

   - DAY

   - HOUR

   - MINUTE 

   - SECOND

 

 예제 

SELECT DATEDIFF(MONTH, '2023-01-01', '2024-09-19') AS month_diff ;

 

   1) 경력 계산 : 직원의 입사일과 현재 날짜 사이의 차이를 계산할 때

SELECT 
 employee_name,
 DATEDIFF(NOW(), hire_date) AS day_worked
 FROM employees;

 

  2) 이벤트 간격 계산 : 두 이벤트 사이의 시간을 측정할 때

SELECT
  event_name,
  TIMESTAMPDIFF(HOUR, start_time, end_time) AS event_duration_hours
  FROM events ;

 

  3) 유효 기간 계산 : 유효기간이나 만료일을 계산할 때

 

SELECT
   product_name, 
   DATEDIFF(expire_date, NOW()) AS days_until_expiry
FROM products

+ Recent posts