INSERT INTO orders (customer_name, product_name, order_date, delivery_date) VALUES
('김철수', '노트북', '2023-10-01 14:30:00', '2023-10-05'),
('이영희', '스마트폰', '2023-10-02 09:15:00', '2023-10-07'),
('박준혁', '태블릿', '2023-10-03 16:45:00', '2023-10-09'),
('최수진', '헤드폰', '2023-10-04 11:00:00', '2023-10-10'),
('정우진', '키보드', '2023-10-05 18:20:00', '2023-10-12'),
('윤지민', '스마트워치', '2023-10-06 10:30:00', '2023-10-10'),
('한상우', '무선 이어폰', '2023-10-07 15:45:00', '2023-10-07'),
('박현우', '데스크탑 컴퓨터', '2023-10-08 09:30:00', '2023-10-14'),
('이유나', '노트북 쿨러', '2023-10-09 16:10:00', '2023-10-13'),
('정다인', '무선 키보드', '2023-10-10 14:15:00', '2023-10-16'),
('김영훈', '마우스', '2023-10-11 08:30:00', '2023-10-12'),
('황예진', '모니터', '2023-10-12 19:20:00', '2023-10-19'),
('이세진', '스피커', '2023-10-13 11:45:00', '2023-10-13'),
('최나연', '헤드셋', '2023-10-14 14:30:00', '2023-10-18'),
('오성훈', 'USB 허브', '2023-11-01 09:00:00', '2023-11-07'),
('서지우', '외장하드', '2023-11-02 13:25:00', '2023-11-12'),
('김하윤', '태블릿', '2023-11-03 18:50:00', '2023-11-14'),
('박민성', '파워뱅크', '2023-11-04 12:15:00', '2023-11-11'),
('유나영', '스마트폰 케이스', '2023-11-05 16:40:00', '2023-11-10'),
('조현민', '노트북 충전기', '2023-11-06 10:05:00', '2023-11-06'),
('김가현', '블루투스 스피커', '2023-11-07 17:30:00', '2023-11-14'),
('전지훈', '휴대폰 거치대', '2023-11-08 08:45:00', '2023-11-12'),
('하승민', '캠핑 랜턴', '2023-11-09 14:10:00', '2023-11-16'),
('임성준', '보조 배터리', '2023-12-01 20:15:00', '2023-12-09'),
('강은비', '전기 충전기', '2023-12-02 07:50:00', '2023-12-10'),
('남상우', '미니 냉장고', '2023-12-03 12:45:00', '2023-12-12'),
('황정민', '전자 레인지', '2023-12-04 15:30:00', '2023-12-13'),
('정수현', '커피 메이커', '2023-12-05 09:10:00', '2023-12-14'),
('윤채원', '다리미', '2023-12-06 11:40:00', '2023-12-15'),
('박진우', '식기세척기', '2023-12-07 16:25:00', '2023-12-17'),
('김민재', '게임 콘솔', '2023-12-08 14:05:00', '2023-12-18'),
('오지훈', '전자 체중계', '2023-12-09 10:55:00', '2023-12-09'),
('윤선영', '가습기', '2023-12-10 17:45:00', '2023-12-21'),
('박시후', '전동 칫솔', '2023-12-11 13:20:00', '2023-12-22'),
('조은지', '다용도 믹서기', '2023-12-12 09:30:00', '2023-12-23'),
('김태훈', '진공 청소기', '2023-12-13 11:15:00', '2023-12-24'),
('박지수', '전자 온풍기', '2023-12-14 12:00:00', '2023-12-14'),
('정민우', '커피 머신', '2023-12-15 08:40:00', '2023-12-26'),
('최정원', '라디오', '2023-12-16 19:55:00', '2023-12-28'),
('김성환', '휴대용 선풍기', '2023-12-17 15:10:00', '2023-12-29'),
('이정민', '안마 의자', '2023-12-18 18:30:00', '2023-12-18');
INSERT INTO orders (customer_name,product_name,order_date,delivery_date)
values ('홍길동','의자','2024-12-01 13:30:00','2024-12-03');
-- 주문이 이루어진 날짜와 요일 조회 한글로

SELECT order_date,
case dayofweek(order_date)
when 1 then '일'
when 2 then '월'
when 3 then '화'
when 4 then '수'
when 5 then '목'
when 6 then '금'
when 7 then '토'
end as weekday
FROM orders o ;
-- 월별 주문수 조회

SELECT month(order_date) as month, count(*)as ordercount
FROM orders o
group by month(order_date) ;
-- 특정 월의 주문내역 조회
-- 12월에 이루어진 주문내역 조회

SELECT *
FROM orders o
where month (order_date)=12;
-- 주문과 배송 날짜간의 일수차이 계산

SELECT *, datediff(delivery_date,order_date)
FROM orders o ;
-- 하루안에 처리된 주문 조회 (주문일 배송일이 동일한 건 조회)

SELECT *
FROM orders o
WHERE datediff(delivery_date,order_date)=0;
Deliver_date는 시간정보가 없고, Order_date에는 시간정보가 있었음
SELECT *
from orders o
WHERE date(order_date) = delivery_date ;
요쪽이 더 간단하고 정확
--★ 가장 최근에 이루어진 주문 조회
2단계 거치기
SELECT max(order_date)
FROM orders o ;
가장 큰 날짜값을 (최근주문건) 확인하고
SELECT *
FROM orders o
WHERE order_date='2023-12-18 18:30:00';
불러오기
★두개를 합친 서브쿼리
SELECT *
FROM orders o
WHERE order_date=(SELECT max(order_date) from orders o);
-- 평일과 주말 구분하여 주문 조회
SELECT *,
case dayofweek(order_date)
when 1 then '주말'
when 7 then '주말'
else '평일'
end as '평일,주간'
FROM orders o ;

IN으로 더 깔끔하게
SELECT *,
case
when dayofweek(order_date) in (1,7) then '주말'
ELSE '평일'
end as '평일주간'
FROM orders o ;
-- 주문일 기준 정확히 4일 후 배송이 예정된 주문내역
SELECT *, date_add(DAte(order_date), INTERVAL 4 day)
from orders o
where delivery_date = date_add(DAte(order_date), INTERVAL 4 day);
-- 특정 시간대에 이루어진 주문 조회
-- 오전(00:00-11:59), 오후 (12:00-23:59) 구분 조회하고 컬럼명 order_period
SELECT *,
case
when time(order_date) between '00:00:00' and '11:59:00' THEN '오전'
when time(order_date) between '12:00:00' and '23:59:00' THEN '오후'
end as order_period
FROM orders o ;
time()대신 hour() 사용 권장
조회는 되었지만 아래와 같은 문제가 있음
- 쿼리 구조: 전반적으로 쿼리 구조는 적절합니다. CASE 문을 사용하여 시간대를 구분하는 것은 좋은 접근 방식입니다.
- 시간 범위:
- '23:59:00'까지만 고려하고 있어 '23:59:01'부터 '23:59:59'까지의 시간은 포함되지 않습니다.
- '12:00:00'은 오후에 포함되어 있습니다. 일반적으로 정오는 오후로 간주되므로 이는 문제가 없습니다.
- 성능: TIME() 함수를 사용하면 인덱스를 활용하기 어려워 성능이 저하될 수 있습니다.
이쪽이 더 깔끔하고 단순명쾌함
SELECT *,
if(hour(order_date) > 12, '오후','오전')
From orders o ;
-- ★오늘 기준으로 3일내인 주문 조회
-- 오늘 날짜
SELECT CURDATE();
-- 오늘 날짜에서 3일을 더한것
SELECT date_add(curdate(), INTERVAL 3 day);
SELECT *
FROM orders o
WHERE delivery_date >= CURDATE() and delivery_date<=date_add(curdate(), INTERVAL 3 day);
-- 주문일 기준 정확히 4일 후 배송이 예정된 주문내역
SELECT *, date_add(DAte(order_date), INTERVAL 4 day)
from orders o
where delivery_date = date_add(DAte(order_date), INTERVAL 4 day);