【问题标题】:Random TIMESTAMP out of range随机时间戳超出范围
【发布时间】:2023-01-27 22:46:48
【问题描述】:

我正在尝试创建一个函数,它返回一系列时间戳之间的随机 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

【问题讨论】:

    标签: oracle function timestamp


    【解决方案1】:

    您要添加 1 天:

    p_from + dbms_random.value () * (p_to - p_from + INTERVAL '1' DAY);
    

    它在 p_fromp_to 加上 1 天的范围内,并且完全按照您的指示执行。

    如果您不希望范围多出 1 天,请删除 + INTERVAL '1' DAY

    【讨论】:

      猜你喜欢
      • 2011-12-22
      • 1970-01-01
      • 2020-05-10
      • 2017-07-13
      • 1970-01-01
      • 1970-01-01
      • 2018-01-24
      • 2016-07-10
      • 2018-09-03
      相关资源
      最近更新 更多