코딩/SQL_Query
MySQL 10년치 날짜 데이터 생성
화이트러시안
2024. 1. 26. 17:25
목적
아래처럼 존재하는 데이터를
| d | best |
| 2026-01-01 | apple |
| 2026-01-03 | orange |
| 2026-01-04 | lemon |
| 2026-01-08 | apple |
아래처럼 보여주고자 하는 경우, 미리 모든 날짜가 기록된 테이블을 생성해 두면 편리하다.
이 작업을 프로시저 없이 진행하는 방법.
| d | best |
| 2026-01-01 | apple |
| 2026-01-02 | |
| 2026-01-03 | orange |
| 2026-01-04 | lemon |
| 2026-01-05 | |
| 2026-01-06 | |
| 2026-01-07 | |
| 2026-01-08 | apple |
작업
반복문을 대체할 테이블 생성
loop를 수행하려면 프로시저를 사용해야 하지만, 아래와 같은 테이블로 대체할 수 있다.
create table t (n int);
insert into t values (1);
insert into t select * from t; -- *2 씩 늘어나므로 10번 수행하면 4096 row 생성
단순히 아래와 같은 row가 4096개 생성된다.
| t | |
| 1 | |
| 1 | |
| ...(생략)... |
필요한만큼 날짜 데이터 생성
10년치 날짜가 존재하는 date_t 라는 테이블을 생성한다.
CREATE TABLE date_t (d DATE); -- 날짜를 저장할 테이블
INSERT INTO date_t
SELECT d FROM (
SELECT @rnum:=@rnum+1 AS rownum, DATE(ADDDATE('2026-01-01', INTERVAL @rnum DAY)) AS d
FROM (SELECT @rnum:=-1) r, t
) t WHERE YEAR(d) < 2036;
결과
| d | |
| 2026-01-01 | |
| 2026-01-02 | |
| 2026-01-03 | |
| ...(생략)... | |
| 2035-12-30 | |
| 2035-12-31 |
이제 date_t 테이블과 실제 데이터가 존재하는 테이블을 LEFT / RIGHT JOIN 하면 목적한대로 데이터를 읽어올 수 있다.