📅 날짜와 시간 다루기 (Date Functions)
1. 기본 날짜와 시간 형식
- 문자열이나 날짜 형태로 저장된 데이터는 그대로 비교하면 오류가 날 수 dlTdma
- 보통
YYYY-MM-DD 또는 YYYY-MM-DD HH:MM:SS 형식을 사용
2. 날짜 형식 변환하기 (STR_TO_DATE)
SELECT STR_TO_DATE('2023-05-19 15:30:00', '%Y-%m-%d %H:%i:%s');
- STR_TO_DATE: 문자열을 날짜로 변환
- '%Y-%m-%d %H:%i:%s': 연-월-일 시:분:초 형식
- 출력 예시: 2023-05-19 15:30:00
SELECT DATE_FORMAT(STR_TO_DATE('2023-05-19 15:30:00', '%Y-%m-%d %H:%i:%s'), '%Y-%m') AS month;
- DATE_FORMAT: 날짜에서 특정 형식으로 변환
- '%Y-%m': 연-월 형식
- 출력 예시: 2023-05
4. 더 간단한 방법 (LEFT)
SELECT LEFT('2023-05-19 15:30:00', 7) AS month;
- LEFT: 문자열의 앞 몇 글자만 가져오기
- 출력 예시: 2023-05
- 단순히 앞에서 7자리만 자르기 때문에
DATE_FORMAT보다는 덜 엄격함
5. 날짜 비교하기
- 두 날짜를 비교할 때는 날짜 형식으로 변환한 후 비교해야 정확함
SELECT *
FROM marketer_orders
WHERE STR_TO_DATE(order_purchase_timestamp, '%Y-%m-%d %H:%i:%s') < NOW();
- NOW(): 현재 시각을 반환
- STR_TO_DATE: 문자열을 날짜로 변환
6. 날짜를 기준으로 데이터 묶기 (GROUP BY)
SELECT DATE_FORMAT(STR_TO_DATE(order_purchase_timestamp, '%Y-%m-%d %H:%i:%s'), '%Y-%m') AS month,
COUNT(*) AS cnt_orders
FROM marketer_orders
GROUP BY month;
- 같은 월의 데이터끼리 묶어서 개수 세기
- 출력 예시
| month | cnt_orders |
|---------|------------|
| 2023-05 | 120 |
| 2023-06 | 150 |
7. 비율 계산하기 (ROUND)
SELECT DATE_FORMAT(STR_TO_DATE(order_purchase_timestamp, '%Y-%m-%d %H:%i:%s'), '%Y-%m') AS month,
COUNT(*) AS cnt_orders,
ROUND(COUNT(*) / (SELECT COUNT(*) FROM marketer_orders) * 100, 2) AS order_ratio_percent
FROM marketer_orders
GROUP BY month;
- ROUND: 소수점 둘째 자리까지 깔끔하게
- 출력 예시
| month | cnt_orders | order_ratio_percent |
|---------|------------|---------------------|
| 2023-05 | 120 | 20.00 |
| 2023-06 | 150 | 25.00 |