목적
아래처럼 존재하는 데이터를
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 하면 목적한대로 데이터를 읽어올 수 있다.
'코딩 > SQL_Query' 카테고리의 다른 글
MySQL - 없으면 삭제하기 DELETE NOT EXISTS (0) | 2023.09.07 |
---|---|
MySQL / JS / PHP - ROUND, 반올림, 부가세, 천 단위 (0) | 2023.08.30 |
MySQL 숫자만 영문만 한글만 추출 (0) | 2023.06.30 |
[MySQL] MAX(), MIN() 함수 사용 시 조건 추가 (0) | 2023.06.29 |
[MSSQL] CONVERT 시 DATETIME FORMAT 지정 (LIKE) (0) | 2023.05.19 |