상세 컨텐츠

본문 제목

[TIL] WEEK 2 FRI - DATEDIFF

TIL

by ollive 2024. 7. 5. 20:00

본문

1.DATEDIFF

시간의 기간을 구할 때는 DATEDIFF 함수를 사용하여 구할 수 있다. DATEDIFF(마지막 날짜, 첫번째 날짜)를 적어주면 그 기간을 구해준다. 이 문제의 경우 30일 간의 대여기록이므로 +1이나 30일-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,
       CASE WHEN DATEDIFF(END_DATE,START_DATE) >= 29 THEN '장기 대여'
       ELSE '단기 대여' 
       END AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE LIKE '2022-09%'
ORDER BY HISTORY_ID DESC

문제는 프로그래머스 자동차 대여 기록에서 장기/단기 대여 구분하기 에서 풀 수 있다.


2. UNION

장바구니 별로 우유와 요거트내역이 있는 장바구니 번호를 가져오는 건데, 어떻게 시작해야할지 너무 어려웠다. 처음에는 아래와 같이 써 보았다. 요거트가 있는 행과 우유가 있는 행을 가져와서 합치고, 둘에 장바구니 번호가 같으면 추출하는 형식으로 구상하였다.

SELECT CART_ID
FROM (
(SELECT *
FROM CART_PRODUCTS
WHERE NAME IN (SELECT NAME FROM CART_PRODUCTS WHERE NAME LIKE '%YOGURT%'))
UNION
(SELECT *
FROM CART_PRODUCTS
WHERE NAME IN (SELECT NAME FROM CART_PRODUCTS WHERE NAME LIKE '%MILK%'))
) A
GROUP BY CART_ID
HAVING COUNT(CART_ID) >= 2
ORDER BY ID

 

아래가 옳은 풀이이다. 필요한 COLUMN만 불러오고 WHERE을 간단히 LIKE 로 제시해주어 각각 요거트와 우유가 있는 행의 카트번호만 가져와서 합쳐주었다. 또 둘의 번호가 같으면 카트번호를 반환하도록 HAVING에서 >1 을 제시해주었다.

SELECT CART_ID
FROM
    (SELECT CART_ID, NAME
    FROM CART_PRODUCTS
    WHERE NAME LIKE '%YOGURT%'
    UNION
    SELECT CART_ID, NAME
    FROM CART_PRODUCTS
    WHERE NAME LIKE '%MILK%' 
     ) A
GROUP BY CART_ID
HAVING COUNT(CART_ID) > 1
ORDER BY CART_ID

 

위 문제는 프로그래머스의 우유와 요거트가 담긴 장바구니에서 풀 수 있다.

'TIL' 카테고리의 다른 글

WEEK 3 MON - 특정 기간을 기준으로 구분짓기  (0) 2024.07.08
[WIL] 2주차  (0) 2024.07.05
[TIL] WEEK 2 THUR (find_in_set)  (0) 2024.07.04
[SQL] 카테고리 별 최대값 정보 가져오기 2  (0) 2024.07.03
[TIL] SQL 세션 풀이  (0) 2024.07.03

관련글 더보기