使用DBMS_RANDOM在Oracle中生成随机日期

aemubtdh  于 2022-09-18  发布在  Java
关注(0)|答案(5)|浏览(153)

我有一个匿名区:

DECLARE
   V_DATA   DATE;
BEGIN
   V_DATA := '01-GEN-2000';

   HR.STATISTICHE.RATINGOPERATORI (V_DATA);
   COMMIT;
END;

但我会以随机的方式生成日期。我能做些什么?

lndjwyie

lndjwyie1#

您可以在两个日期之间生成随机日期,如下面的查询所示。随机日期在2000年1月1日和99年12月31日之间生成

SELECT TO_DATE(
              TRUNC(
                   DBMS_RANDOM.VALUE(TO_CHAR(DATE '2000-01-01','J')
                                    ,TO_CHAR(DATE '9999-12-31','J')
                                    )
                    ),'J'
               ) FROM DUAL;

或者您可以使用

SELECT TO_DATE (
              TRUNC (
                     DBMS_RANDOM.VALUE (2451545, 5373484) 
                    )
                , 'J'
              )
  FROM DUAL

在上面的示例中,第一个值为01-Jan-2000,第二个值ID为31-Dec-9999

nqwrtyyt

nqwrtyyt2#

要生成随机日期,您可以使用

select to_date('2010-01-01', 'yyyy-mm-dd')+trunc(dbms_random.value(1,1000)) from dual

或随机约会时间

select to_date('2010-01-01', 'yyyy-mm-dd')+dbms_random.value(1,1000) from dual
f4t66c6m

f4t66c6m3#

如果你想知道它的逻辑,你也可以使用这段代码。

create or replace procedure genDate(result out nvarchar2) IS
  year  number;
  month  number;
  day  number;
Begin
  year:=FLOOR(DBMS_RANDOM.value(2000,2100));
  month:=FLOOR(DBMS_RANDOM.value(1,12));
  IF month=2 and (year/4)=0 and (year/100)!=0 then
    day:=FLOOR(DBMS_RANDOM.value(1,29));
  ELSIF month=2 or (year/100)=0 then
    day:=FLOOR(DBMS_RANDOM.value(1,28));
  ELSIF MOD(month,2)=1 then
    day:=FLOOR(DBMS_RANDOM.value(1,31));
  ELSIF MOD(month,2)=0 and month!=2 then
    day:=FLOOR(DBMS_RANDOM.value(1,30));
  END IF;  
  result:=month||'-'||day||'-'||year;
End;
x33g5p2x

x33g5p2x4#

这里有另一个选项来生成从现在开始返回的日期,其中365天的数量从今天返回,‘DD.MM.YYYY’-MASK

to_char(sysdate-dbms_random.value()*365, 'DD.MM.YYYY')

o4hqfura

o4hqfura5#

我需要生成用于测试的员工数据。每个员工都需要一个出生日期,使他们的年龄在16岁到65岁之间,以及一个在他们16岁生日和SYSDATE之间的某个时间。这就是如何..。

FUNCTION randomDateInRange(alpha IN DATE, omega IN DATE) RETURN DATE IS
BEGIN
    RETURN alpha + DBMS_RANDOM.VALUE(0, omega - alpha);
END;

...然后,要使用此功能...

-- an employee can be any age from 16 to 65 years of age
DoB := randomDateInRange(
    SYSDATE - INTERVAL '65' YEAR,
    SYSDATE - INTERVAL '16' YEAR
);

-- an employee could have been hired any date since their sixteenth birthday
DoH := randomDateInRange(
    DoB + INTERVAL '16' YEAR,
    SYSDATE
);

相关问题