[英]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.