본문 바로가기
DB/SQL 예제

날짜 예제

by ssury94 2024. 12. 2.
더보기

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() 사용 권장

조회는 되었지만 아래와 같은 문제가 있음

  1. 쿼리 구조: 전반적으로 쿼리 구조는 적절합니다. CASE 문을 사용하여 시간대를 구분하는 것은 좋은 접근 방식입니다.
  2. 시간 범위:
    • '23:59:00'까지만 고려하고 있어 '23:59:01'부터 '23:59:59'까지의 시간은 포함되지 않습니다.
    • '12:00:00'은 오후에 포함되어 있습니다. 일반적으로 정오는 오후로 간주되므로 이는 문제가 없습니다.
  3. 성능: TIME() 함수를 사용하면 인덱스를 활용하기 어려워 성능이 저하될 수 있습니다.
  4.  

 

이쪽이 더 깔끔하고 단순명쾌함

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);