如何使用PL/SQL生成两个指定timestamp之间的随机时间戳
问题描述
我对PL/SQL不太熟悉,想寻找可以生成两个指定timestamp之间的随机时间戳的函数或代码。举个例子,我需要生成落在如下时间区间内的随机时间戳:
12-FEB-18 12.00.00.000000 AM - 13-MAR-19 12.00.00.000000 AM
我查看到的已有方案看起来仅支持生成当前时间戳与另一个时间戳之间的随机时间,请问有没有可以生成任意两个指定时间戳之间随机时间戳的实现方法?
实现方案
核心逻辑
计算两个指定时间戳的时间间隔,生成0到1之间的随机数乘以该间隔,再加到起始时间戳上,即可得到落在目标区间内的随机时间戳。方案额外兼容了起始时间和结束时间传参顺序颠倒的场景,不用严格校验输入顺序。
单条SQL快速实现
直接运行以下SQL即可生成你指定区间内的随机时间戳:
SELECT TO_TIMESTAMP('12-FEB-18 12.00.00.000000 AM', 'DD-MON-RR HH.MI.SS.FF6 AM') + DBMS_RANDOM.VALUE(0, (TO_TIMESTAMP('13-MAR-19 12.00.00.000000 AM', 'DD-MON-RR HH.MI.SS.FF6 AM') - TO_TIMESTAMP('12-FEB-18 12.00.00.000000 AM', 'DD-MON-RR HH.MI.SS.FF6 AM')) ) AS random_timestamp FROM DUAL;
封装为可复用函数
如果需要频繁调用,可以封装为自定义函数:
CREATE OR REPLACE FUNCTION get_random_timestamp( p_start TIMESTAMP, p_end TIMESTAMP ) RETURN TIMESTAMP IS BEGIN -- 自动适配传参顺序,无需严格保证起始时间小于结束时间 IF p_start > p_end THEN RETURN p_end + DBMS_RANDOM.VALUE(0, p_start - p_end); END IF; RETURN p_start + DBMS_RANDOM.VALUE(0, p_end - p_start); END get_random_timestamp; /
函数调用示例
SELECT get_random_timestamp( TO_TIMESTAMP('12-FEB-18 12.00.00.000000 AM', 'DD-MON-RR HH.MI.SS.FF6 AM'), TO_TIMESTAMP('13-MAR-19 12.00.00.000000 AM', 'DD-MON-RR HH.MI.SS.FF6 AM') ) AS random_timestamp FROM DUAL;
注意事项
- 如果执行时报
DBMS_RANDOM权限不足,可通过管理员账号执行授权语句:GRANT EXECUTE ON SYS.DBMS_RANDOM TO 你的用户名; - 时间格式转换符可根据你实际传入的时间格式调整,比如使用
YYYY-MM-DD HH24:MI:SS.FF6适配常用的年月日格式。
内容的提问来源于stack exchange,提问作者user2125853
相关产品推荐
相关产品推荐

