在HGDB中生成连续时间数据
1、文档用途
本文介绍了如何使用函数generate_series产生连续的时间数据。
2、详细信息
在一些业务场景下,有时需要数据库产生连续时间的数据。HGDB中,可以通过函数generate_series批量产生数据。
下面是按月、天、小时产生数据的示例。
按月产生连续数据
highgo=# SELECT to_char( T, 'yyyy-mm' ) AS TIME
FROM generate_series(to_timestamp('2020-01', 'yyyy-mm'), to_timestamp('2020-10', 'yyyy-mm'), '1 months') AS T;
time
---------
2020-01
2020-02
2020-03
2020-04
2020-05
2020-06
2020-07
2020-08
2020-09
2020-10
(10 rows)
按天产生连续数据
highgo=# SELECT to_char( T, 'yyyy-mm-dd' ) AS TIME
highgo-# FROM generate_series(to_timestamp('2020-01-01', 'yyyy-mm-dd'), to_timestamp('2020-01-03', 'yyyy-mm-dd'), '1 days') AS T;
time
------------
2020-01-01
2020-01-02
2020-01-03
(3 rows)
按小时产生连续数据
highgo=# SELECT to_char( t, ‘yyyy-mm-dd hh24:mi:ss’ ) AS TIME
highgo-# FROM generate_series ( to_timestamp( '2020-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss' ), to_timestamp( '2020-01-02 00:00:00', 'yyyy-mm-dd hh24:mi:ss' ), '1 hours' ) AS t;
time
---------------------
2020-01-01 00:00:00
2020-01-01 01:00:00
2020-01-01 02:00:00
2020-01-01 03:00:00
2020-01-01 04:00:00
2020-01-01 05:00:00
2020-01-01 06:00:00
2020-01-01 07:00:00
2020-01-01 08:00:00
2020-01-01 09:00:00
2020-01-01 10:00:00
2020-01-01 11:00:00
2020-01-01 12:00:00
2020-01-01 13:00:00
2020-01-01 14:00:00
2020-01-01 15:00:00
2020-01-01 16:00:00
2020-01-01 17:00:00
2020-01-01 18:00:00
2020-01-01 19:00:00
2020-01-01 20:00:00
2020-01-01 21:00:00
2020-01-01 22:00:00
2020-01-01 23:00:00
2020-01-02 00:00:00
(25 rows)
根据上面的语句还可以产生按分钟、按秒的语句,写法如下
--按分钟产生连续时间数据
SELECT to_char( t, 'yyyy-mm-dd hh24:mi:ss' ) AS TIME
FROM generate_series ( to_timestamp( '2020-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss' ), to_timestamp( '2020-01-02 00:00:00', 'yyyy-mm-dd hh24:mi:ss' ), '1 minutes' ) AS t;
--按秒产生连续时间数据
SELECT to_char( t, 'yyyy-mm-dd hh24:mi:ss' ) AS TIME
FROM generate_series ( to_timestamp( '2020-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss' ), to_timestamp( '2020-01-02 00:00:00', 'yyyy-mm-dd hh24:mi:ss' ), '1 seconds' ) AS t;
如果需要产生间隔的时间数据,只需要修改generate_series的第三个参数,如果需要间隔一小时的时间数据,将“1 hours”修改为“2 hours”即可。
根据上面的例子,可以产生当月1号到当前时间的所有时间数据,如下:
highgo=# SELECT to_char(tt,'yyyy-mm-dd') as TIME FROM generate_series(date_trunc('month',now()), now(), '1 days') AS tt;
time
------------
2020-05-01
2020-05-02
2020-05-03
2020-05-04
2020-05-05
2020-05-06
2020-05-07
2020-05-08
2020-05-09
2020-05-10
2020-05-11
2020-05-12
2020-05-13
2020-05-14
2020-05-15
2020-05-16
2020-05-17
2020-05-18
2020-05-19
2020-05-20
2020-05-21
2020-05-22
2020-05-23
2020-05-24
2020-05-25
(25 rows)
根据需要,可以将上述语句修改为按小时、分钟、秒等时间精度产生数据,与前面修改方法相同。