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

时间:2013-07-03 13:57:37

标签: oracle date random plsql database

我有这个匿名阻止:

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

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

但我会以随机的方式生成日期。我该怎么办?

4 个答案:

答案 0 :(得分:26)

您可以在两个日期之间生成随机日期,如下面的查询所示.Random日期在1-jan-2000和31-dec-9999之间生成

  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

在上面的例子中,第一个值是2000年1月1日,第二个值是31-dec-9999

答案 1 :(得分:4)

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

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

答案 2 :(得分:0)

如果您想查看它的逻辑,您也可以使用此代码。

  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;

答案 3 :(得分:0)

还有另一种方法可以生成从现在开始回溯的日期,即从今天开始回溯的365天数量,'DD.MM.YYYY'-掩码

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