1
0
mirror of https://github.com/postgres/postgres.git synced 2025-12-21 05:21:08 +03:00

Add date and timestamp variants of random(min, max).

This adds 3 new variants of the random() function:

    random(min date, max date) returns date
    random(min timestamp, max timestamp) returns timestamp
    random(min timestamptz, max timestamptz) returns timestamptz

Each returns a random value x in the range min <= x <= max.

Author: Damien Clochard <damien@dalibo.info>
Reviewed-by: Greg Sabino Mullane <htamfids@gmail.com>
Reviewed-by: Dean Rasheed <dean.a.rasheed@gmail.com>
Reviewed-by: Vik Fearing <vik@postgresfriends.org>
Reviewed-by: Chao Li <li.evan.chao@gmail.com>
Discussion: https://postgr.es/m/f524d8cab5914613d9e624d9ce177d3d@dalibo.info
This commit is contained in:
Dean Rasheed
2025-09-09 10:39:30 +01:00
parent 5ac3c1ac22
commit faf071b553
7 changed files with 254 additions and 10 deletions

View File

@@ -536,3 +536,90 @@ SELECT n, random(0, trim_scale(abs(1 - 10.0^(-n)))) FROM generate_series(-20, 20
20 | 0.60795101234744211935
(41 rows)
-- random dates
SELECT random('1979-02-08'::date,'2025-07-03'::date) AS random_date_multiple_years;
random_date_multiple_years
----------------------------
04-09-1986
(1 row)
SELECT random('4714-11-24 BC'::date,'5874897-12-31 AD'::date) AS random_date_maximum_range;
random_date_maximum_range
---------------------------
10-02-2898131
(1 row)
SELECT random('1979-02-08'::date,'1979-02-08'::date) AS random_date_empty_range;
random_date_empty_range
-------------------------
02-08-1979
(1 row)
SELECT random('2024-12-31'::date, '2024-01-01'::date); -- fail
ERROR: lower bound must be less than or equal to upper bound
SELECT random('-infinity'::date, '2024-01-01'::date); -- fail
ERROR: lower and upper bounds must be finite
SELECT random('2024-12-31'::date, 'infinity'::date); -- fail
ERROR: lower and upper bounds must be finite
-- random timestamps
SELECT random('1979-02-08'::timestamp,'2025-07-03'::timestamp) AS random_timestamp_multiple_years;
random_timestamp_multiple_years
---------------------------------
Fri Jan 27 18:52:05.366009 2017
(1 row)
SELECT random('4714-11-24 BC'::timestamp,'294276-12-31 23:59:59.999999'::timestamp) AS random_timestamp_maximum_range;
random_timestamp_maximum_range
-----------------------------------
Wed Mar 28 00:45:36.180395 226694
(1 row)
SELECT random('2024-07-01 12:00:00.000001'::timestamp, '2024-07-01 12:00:00.999999'::timestamp) AS random_narrow_range;
random_narrow_range
---------------------------------
Mon Jul 01 12:00:00.999286 2024
(1 row)
SELECT random('1979-02-08'::timestamp,'1979-02-08'::timestamp) AS random_timestamp_empty_range;
random_timestamp_empty_range
------------------------------
Thu Feb 08 00:00:00 1979
(1 row)
SELECT random('2024-12-31'::timestamp, '2024-01-01'::timestamp); -- fail
ERROR: lower bound must be less than or equal to upper bound
SELECT random('-infinity'::timestamp, '2024-01-01'::timestamp); -- fail
ERROR: lower and upper bounds must be finite
SELECT random('2024-12-31'::timestamp, 'infinity'::timestamp); -- fail
ERROR: lower and upper bounds must be finite
-- random timestamps with timezone
SELECT random('1979-02-08 +01'::timestamptz,'2025-07-03 +02'::timestamptz) AS random_timestamptz_multiple_years;
random_timestamptz_multiple_years
-------------------------------------
Tue Jun 14 04:41:16.652896 2016 PDT
(1 row)
SELECT random('4714-11-24 BC +00'::timestamptz,'294276-12-31 23:59:59.999999 +00'::timestamptz) AS random_timestamptz_maximum_range;
random_timestamptz_maximum_range
--------------------------------------
Wed Mar 26 14:07:16.980265 31603 PDT
(1 row)
SELECT random('2024-07-01 12:00:00.000001 +04'::timestamptz, '2024-07-01 12:00:00.999999 +04'::timestamptz) AS random_timestamptz_narrow_range;
random_timestamptz_narrow_range
-------------------------------------
Mon Jul 01 01:00:00.835808 2024 PDT
(1 row)
SELECT random('1979-02-08 +05'::timestamptz,'1979-02-08 +05'::timestamptz) AS random_timestamptz_empty_range;
random_timestamptz_empty_range
--------------------------------
Wed Feb 07 11:00:00 1979 PST
(1 row)
SELECT random('2024-01-01 +06'::timestamptz, '2024-01-01 +07'::timestamptz); -- fail
ERROR: lower bound must be less than or equal to upper bound
SELECT random('-infinity'::timestamptz, '2024-01-01 +07'::timestamptz); -- fail
ERROR: lower and upper bounds must be finite
SELECT random('2024-01-01 +06'::timestamptz, 'infinity'::timestamptz); -- fail
ERROR: lower and upper bounds must be finite

View File

@@ -277,3 +277,29 @@ SELECT random(-1e30, 1e30) FROM generate_series(1, 10);
SELECT random(-0.4, 0.4) FROM generate_series(1, 10);
SELECT random(0, 1 - 1e-30) FROM generate_series(1, 10);
SELECT n, random(0, trim_scale(abs(1 - 10.0^(-n)))) FROM generate_series(-20, 20) n;
-- random dates
SELECT random('1979-02-08'::date,'2025-07-03'::date) AS random_date_multiple_years;
SELECT random('4714-11-24 BC'::date,'5874897-12-31 AD'::date) AS random_date_maximum_range;
SELECT random('1979-02-08'::date,'1979-02-08'::date) AS random_date_empty_range;
SELECT random('2024-12-31'::date, '2024-01-01'::date); -- fail
SELECT random('-infinity'::date, '2024-01-01'::date); -- fail
SELECT random('2024-12-31'::date, 'infinity'::date); -- fail
-- random timestamps
SELECT random('1979-02-08'::timestamp,'2025-07-03'::timestamp) AS random_timestamp_multiple_years;
SELECT random('4714-11-24 BC'::timestamp,'294276-12-31 23:59:59.999999'::timestamp) AS random_timestamp_maximum_range;
SELECT random('2024-07-01 12:00:00.000001'::timestamp, '2024-07-01 12:00:00.999999'::timestamp) AS random_narrow_range;
SELECT random('1979-02-08'::timestamp,'1979-02-08'::timestamp) AS random_timestamp_empty_range;
SELECT random('2024-12-31'::timestamp, '2024-01-01'::timestamp); -- fail
SELECT random('-infinity'::timestamp, '2024-01-01'::timestamp); -- fail
SELECT random('2024-12-31'::timestamp, 'infinity'::timestamp); -- fail
-- random timestamps with timezone
SELECT random('1979-02-08 +01'::timestamptz,'2025-07-03 +02'::timestamptz) AS random_timestamptz_multiple_years;
SELECT random('4714-11-24 BC +00'::timestamptz,'294276-12-31 23:59:59.999999 +00'::timestamptz) AS random_timestamptz_maximum_range;
SELECT random('2024-07-01 12:00:00.000001 +04'::timestamptz, '2024-07-01 12:00:00.999999 +04'::timestamptz) AS random_timestamptz_narrow_range;
SELECT random('1979-02-08 +05'::timestamptz,'1979-02-08 +05'::timestamptz) AS random_timestamptz_empty_range;
SELECT random('2024-01-01 +06'::timestamptz, '2024-01-01 +07'::timestamptz); -- fail
SELECT random('-infinity'::timestamptz, '2024-01-01 +07'::timestamptz); -- fail
SELECT random('2024-01-01 +06'::timestamptz, 'infinity'::timestamptz); -- fail