PostgreSQL 19新特性之随机日期和时间
PostgreSQL 中的随机函数 random() 可以用于返回一个随机数,例如:
-- 生成一个大于等于0,小于1的随机数
SELECT random();random |
------------------+
0.6088934666983767|-- 生成一个大于等于1,小于等于10的随机整数
SELECT random(1, 10);random|
------+8|-- 生成一个遵循均值为 0.0,标准差为 1.0 的正态分布的随机数
SELECT random_normal(0.0, 1.0);random_normal |
------------------+
0.1809493674775017|
如果想要获取一个随机的日期或者时间,需要使用算术运算,例如:
-- 生成一个从今天开始到30天之内(包含)的随机日期
SELECT current_date + floor((random() * 31))::int;?column? |
----------+
2025-11-07|-- 生成一个从现在开始一年之内的随机时间
select now() + '1 year'::interval * random();?column? |
-----------------------------+
2026-03-05 00:29:51.668 +0800|
正在开发中的 PostgreSQL 19 为该函数新增了三种参数形式:
- random(min date, max date),返回一个随机日期 x,min <= x <= max;
- random(min timestamp, max timestamp),返回一个随机时间戳 x,min <= x <= max;
- random(min timestamptz, max timestamptz),返回一个包含时区的随机时间戳 x,min <= x <= max。
以下是一些使用示例:
with test_data as (select random('2000-01-01'::date, '2000-04-30'::date) as rfrom generate_series(1,100000)
)
select min(r), max(r), count(*)
from test_data;min | max | count
------------+------------+--------2000-01-01 | 2000-04-30 | 100000
(1 row)with test_data as (select random('2000-01-01 01:23:45'::timestamp, '2000-04-30 01:23:45'::timestamp) as rfrom generate_series(1,100000)
)
select min(r), max(r), count(*)
from test_data;min | max | count
----------------------------+----------------------------+--------2000-01-01 01:24:10.154934 | 2000-04-30 01:19:23.423265 | 100000
(1 row)with test_data as (select random(now() - '3 months'::interval, now()) as rfrom generate_series(1,100000)
)
select min(r), max(r), count(*)
from test_data;min | max | count
-------------------------------+-------------------------------+--------2025-07-17 17:11:52.219076+02 | 2025-09-17 17:09:55.847463+02 | 100000
(1 row)
这些内置函数可以简化日期和时间相关的随机数据生成代码。