繁体   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