DB/PostgreSQL

[PostgreSQL] 시간, 숫자, 날짜 생성하기 (generate_series)

불곰1 2022. 2. 20. 16:40

파이썬과 같은 프로그래밍 언어에서 1~10까지의 수를 생성하거나 2022-01-01 ~ 2022-01-10 까지의 날짜를 생성하는 것은 반복문을 통해 쉽게 만들 수 있습니다.

postgresql에서도 generate_series 함수를 사용하면 이러한 문제를 쉽게 해결할 수 있습니다.

generate_series(start, stop, [step 또는 interval))

3번째 인자는 입력된 타입이 int인지 timestamp인지에 따라서 step 이거나 inteval을 줄 수 있습니다.

SELECT * FROM generate_series(2,4);
 generate_series
-----------------
               2
               3
               4
(3 rows)

SELECT * FROM generate_series(5,1,-2);
 generate_series
-----------------
               5
               3
               1
(3 rows)

SELECT * FROM generate_series(4,3);
 generate_series
-----------------
(0 rows)

-- this example relies on the date-plus-integer operator
SELECT current_date + s.a AS dates FROM generate_series(0,14,7) AS s(a);
   dates
------------
 2004-02-05
 2004-02-12
 2004-02-19
(3 rows)

SELECT * FROM generate_series('2008-03-01 00:00'::timestamp,
                              '2008-03-04 12:00', '10 hours');
   generate_series   
---------------------
 2008-03-01 00:00:00
 2008-03-01 10:00:00
 2008-03-01 20:00:00
 2008-03-02 06:00:00
 2008-03-02 16:00:00
 2008-03-03 02:00:00
 2008-03-03 12:00:00
 2008-03-03 22:00:00
 2008-03-04 08:00:00
(9 rows)

SELECT generate_series('2020-01-01'::date, 
                                             '2020-12-31'::date, '1 months');
   generate_series   
-------------------------
2020-01-01 00:00:00.000000
2020-02-01 00:00:00.000000
2020-03-01 00:00:00.000000
2020-04-01 00:00:00.000000
2020-05-01 00:00:00.000000
2020-06-01 00:00:00.000000
2020-07-01 00:00:00.000000
2020-08-01 00:00:00.000000
2020-09-01 00:00:00.000000
2020-10-01 00:00:00.000000
2020-11-01 00:00:00.000000
2020-12-01 00:00:00.000000

레퍼런스

Set Returning Functions