Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL 뷰(View)를 활용해 날짜 범위 내의 날짜 목록 자동 생성하기

MySQL에서 뷰를 이용해 날짜 시퀀스 생성하기

MySQL에는 PostgreSQL의 generate_series()처럼 연속된 날짜를 한 번에 만들어 주는 내장 기능이 없습니다. 하지만 뷰(View)를 단계적으로 정의하면 특정 날짜 범위에 포함된 모든 날짜를 손쉽게 생성할 수 있습니다. 이 글에서는 숫자 뷰를 조합해 날짜 목록을 만드는 과정을 예제와 함께 살펴보겠습니다.

1단계: 0~9 숫자를 담은 digits 뷰 만들기

가장 먼저 한 자리 숫자(0~9)만을 가지는 digits 뷰를 생성합니다. 이 뷰는 다음 단계에서 더 큰 숫자 집합을 조합하기 위한 기본 재료로 사용됩니다.

mysql> CREATE VIEW digits AS
    -> SELECT 0 AS digit UNION ALL
    -> SELECT 1 UNION ALL
    -> SELECT 2 UNION ALL
    -> SELECT 3 UNION ALL
    -> SELECT 4 UNION ALL
    -> SELECT 5 UNION ALL
    -> SELECT 6 UNION ALL
    -> SELECT 7 UNION ALL
    -> SELECT 8 UNION ALL
    -> SELECT 9;
Query OK, 0 rows affected (0.08 sec)

2단계: 0~9999 숫자를 생성하는 numbers 뷰 만들기

digits 뷰를 일의 자리(ones), 십의 자리(tens), 백의 자리(hundreds), 천의 자리(thousands)라는 네 개의 별칭으로 교차 조인한 뒤 각 자릿값을 곱해 더하면, 0부터 9999까지 총 10,000개의 연속된 숫자를 얻을 수 있습니다.

mysql> CREATE VIEW numbers AS
    -> SELECT ones.digit + tens.digit * 10 + hundreds.digit * 100 + thousands.digit * 1000 AS number
    -> FROM digits AS ones, digits AS tens, digits AS hundreds, digits AS thousands;
Query OK, 0 rows affected (0.09 sec)

3단계: 과거·미래 날짜를 생성하는 dates1 뷰 만들기

SUBDATE() 함수는 현재 날짜에서 number일만큼 빼 과거 날짜를 만들고, ADDDATE() 함수는 number + 1일만큼 더해 미래 날짜를 생성합니다. 두 결과를 UNION ALL로 합치면 어제부터 약 10,000일 후까지의 날짜가 모두 준비됩니다.

mysql> CREATE VIEW dates1 AS
    -> SELECT SUBDATE(CURRENT_DATE(), number) AS date FROM numbers
    -> UNION ALL
    -> SELECT ADDDATE(CURRENT_DATE(), number + 1) AS date FROM numbers;
Query OK, 0 rows affected (0.09 sec)

4단계: 원하는 날짜 범위 조회하기

이제 WHERE 절의 BETWEEN 조건으로 원하는 구간의 날짜만 필터링하고 ORDER BY로 정렬하면 됩니다. 아래는 2017년 11월 15일부터 11월 30일까지의 날짜를 조회한 결과입니다.

mysql> SELECT date FROM dates1
    -> WHERE date BETWEEN '2017-11-15' AND '2017-11-30'
    -> ORDER BY date;
+------------+
| date       |
+------------+
| 2017-11-15 |
| 2017-11-16 |
| 2017-11-17 |
| 2017-11-18 |
| 2017-11-19 |
| 2017-11-20 |
| 2017-11-21 |
| 2017-11-22 |
| 2017-11-23 |
| 2017-11-24 |
| 2017-11-25 |
| 2017-11-26 |
| 2017-11-27 |
| 2017-11-28 |
| 2017-11-29 |
| 2017-11-30 |
+------------+
16 rows in set (0.05 sec)

동작 원리 정리

  • digits 뷰: 0~9의 한 자리 숫자를 제공하는 기본 단위입니다.
  • numbers 뷰: digits를 네 번 조합해 0~9999의 연속된 숫자를 만듭니다.
  • dates1 뷰: SUBDATE와 ADDDATE로 과거와 미래 날짜를 생성한 뒤 하나로 합칩니다.
  • BETWEEN 조회: 필요한 날짜 구간만 골라 정렬된 목록을 얻습니다.

이 방식을 응용하면 별도의 달력 테이블 없이도 리포트 작성, 결측 날짜 채우기, 기간별 통계 집계 등에 유용하게 활용할 수 있습니다. 더 넓은 날짜 범위가 필요하다면 digits 뷰를 한 번 더 조합해 숫자 범위를 확장하면 됩니다.