
[英]Oracle TIMESTAMP error:datetime/interval precision is out of range
[英]Random TIMESTAMP out of range
我正在尝试创建一个 function,它返回一系列时间戳之间的随机 TIMESTAMP。
它似乎并不是一直都在工作,因为有时我会在开始范围之前得到一个值,有时我会在结束范围之后得到一个值。
下面是我的测试案例和 TIMESTAMP 超出范围的示例。在此示例中,TIMESTAMP 在 TIMESTAMP '2023-01-25 12:00:00' 的结束范围之后
有人可以解释一下问题是什么,并告诉我如何解决它,因为我似乎无法弄清楚。
ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'DD-MON-YYYY HH24:MI:SS.FF';
CREATE OR REPLACE FUNCTION random_timestamp(
p_from IN TIMESTAMP,
p_to IN TIMESTAMP,
p_fraction IN VARCHAR2 DEFAULT 'Y'
) RETURN TIMESTAMP
IS
return_val_y TIMESTAMP := p_from + dbms_random.value () * (p_to - p_from + INTERVAL '1' DAY);
return_val_n TIMESTAMP (0) := return_val_y;
BEGIN
RETURN CASE
WHEN UPPER (SUBSTR (p_fraction, 1, 1)) = 'Y'
THEN return_val_y
ELSE return_val_N
END;
END random_timestamp;
/
SELECT random_timestamp(
TIMESTAMP '2023-01-25 09:00:00', TIMESTAMP '2023-01-25 12:00:00') as ts from dual
TS
26-JAN-2023 03:59:06.013730
您要添加 1 天:
p_from + dbms_random.value () * (p_to - p_from + INTERVAL '1' DAY);
它在p_from
到p_to
加上 1 天的范围内,并且完全按照您的指示执行。
如果您不希望范围多出 1 天,则删除+ INTERVAL '1' DAY
CREATE OR REPLACE FUNCTION random_timestamp(
p_from IN TIMESTAMP,
p_to IN TIMESTAMP,
p_fraction IN VARCHAR2 DEFAULT 'Y'
) RETURN TIMESTAMP
IS
return_val_y TIMESTAMP(9) := p_from + dbms_random.value() * (p_to - p_from);
return_val_n TIMESTAMP(0) := return_val_y;
BEGIN
RETURN CASE
WHEN p_fraction LIKE 'Y%' OR p_fraction LIKE 'y%'
THEN return_val_y
ELSE return_val_n
END;
END random_timestamp;
/
然后:
SELECT MIN(ts),
MAX(ts)
FROM (
SELECT random_timestamp(
TIMESTAMP '2023-01-25 09:00:00',
TIMESTAMP '2023-01-25 12:00:00'
) AS ts
FROM DUAL
CONNECT BY LEVEL <= 1e6
);
可随机output:
分钟(TS) | 最大值(TS) |
---|---|
25-JAN-23 09.00.00.017186000 | 25-JAN-23 11.59.59.999534000 |
并保持在范围内。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.