簡體   English   中英

隨機時間戳超出范圍

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM