[MySQL] 날짜/시간차이계산 : DATEDIFF, TIMESTAMPDIFF 함수 / 단위별 날짜 조회하기

lazy_h·2026년 1월 9일

MySQL 다루기

목록 보기
13/18
post-thumbnail

(※개인 공부 목적의 게시물입니다.)


프로그래머스 > sql > string, date > 자동차 대여 기록에서 장기/단기 대여 구분하기

문제 바로가기


<문제설명>

다음은 어느 자동차 대여 회사의 자동차 대여 기록 정보를 담은 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블입니다.

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블은 아래와 같은 구조로 되어있으며, HISTORY_ID, CAR_ID, START_DATE, END_DATE 는 각각 자동차 대여 기록 ID, 자동차 ID, 대여 시작일, 대여 종료일을 나타냅니다.

Column nameTypeNullable
HISTORY_IDINTEGERFALSE
CAR_IDINTEGERFALSE
START_DATEDATEFALSE
END_DATEDATEFALSE

<문제>

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

결과는 대여 기록 ID를 기준으로 내림차순 정렬해주세요.
(날짜의 데이터 포맷은 시간을 제외한 날짜만 출력해야 정답처리된다.)


<풀이코드>

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 START_DATE >= '2022-09-01'
	AND START_DATE < '2022-10-01'
#WHERE START_DATE BETWEEN '2022-09-01' AND '2022-09-30'
#WHERE YEAR(START_DATE)=2022 AND MONTH(START_DATE)=9

ORDER BY HISTORY_ID DESC;

<설명>

  • CASE
        WHEN (DATEDIFF(END_DATE, START_DATE) + 1) >= 30
        THEN '장기 대여'
        ELSE '단기 대여'
        END AS RENT_TYPE
    • CASE-WHEN 조건문을 통해 새로운 컬럼 RENT_TYPE을 추가
    • 대여기간을 구하는 방법 = [END_DATE] - [START_DATE] + 1
    • 날짜 차이를 계산하기 위해서 DATEDIFF 함수를 사용

[DATEDIFF()/TIMESTAMPDIFF()]

  1. DATEDIFF(날짜1, 날짜2) : [날짜1 - 날짜2]'일(DAY)' 기준으로 반환

예시)

DATEDIFF('2022-08-26', '2022-08-01')
  • 결과 -> 25
DATEDIFF('2022-08-26 16:33:20', '2022-08-01 00:00:00')
  • 결과 -> 25
  1. TIMESTAMPDIFF(단위, 날짜1, 날짜2) : 단위를 지정하여 [날짜2 -날짜1] 결과를 반환
  • 단위
    • SECOND : 초
    • MINUTE : 분
    • HOUR : 시간
    • DAY : 일
    • WEEK : 주
    • MONTH : 월
    • QUARTER : 분기
    • YEAR : 연도

예시)

TIMESTAMPDIFF(DAY, STRAT_DATE, END_DATE)
  • DAY(일)을 기준으로 [END_DATE - START_DATE] 결과를 반환
  • 위 문제에서 DATEDIFF 대신 사용해도됨
TIMESTAMPDIFF(SECOND, '2022-08-26 15:30:33', '2022-08-26 15:32:21')
  • 결과 -> 108

  • WHERE START_DATE >= '2022-09-01'
    	AND START_DATE < '2022-10-01'
    #WHERE START_DATE BETWEEN '2022-09-01' AND '2022-09-30'
    #WHERE YEAR(START_DATE)=2022 AND MONTH(START_DATE)=9
    • 대여시작일이 2022년 9월에 속하는 대여기록을 찾기위한 조건

    • START_DATE >= '2022-09-01' AND START_DATE < '2022-10-01'
      -> ☆가장 권장되는 방식☆, 9월 구간만 빠르게 점프해서 읽음(필요한 행만 골라 읽음)

    • START_DATE BETWEEN '2022-09-01' AND '2022-09-30'
      -> 이것도 가능하지만 2022-09-30 00:00:00 까지만 포함

    • YEAR(START_DATE)=2022 AND MONTH(START_DATE)=9

      • 연도와 월만 추출해서 비교가능
      • 다만 필요한 범위(2022년 9월)에만 접근하지 않고 테이블 전체를 처음부터 끝까지 읽으며 연, 월을 비교하기 때문에 처리속도가 느림
      • [처리과정] : 행 하나 읽음
        -> START_DATE 꺼냄
        -> YEAR(START_DATE)와 MONTH(START_DATE) 계산
        -> 결과와 비교
        -> 다음행 반복 ... 풀 데이터를 스캔
      • 데이터량이 적을 때 사용권장

[단위별 날짜 조회하는 함수] : YYYY-MM-DD HH:MM:SS

  • YEAR() : '연도' 조회
  • MONTH() : '월' 조회
  • DAY() : '일' 조회
  • DATE() : '연도 + 월 + 일' 조회
  • HOUR() : '시간' 조회
  • MINUTE() : '분' 조회
  • SECOND() : '초' 조회
  • TIME() : '시간 + 분 + 초' 조회
  • DATETIME() : '날짜 + 시간' 조회

profile
fun coding

0개의 댓글