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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user