【问题标题】:Generate a random date in Oracle with DBMS_RANDOM使用 DBMS_RANDOM 在 Oracle 中生成随机日期
【发布时间】:2013-07-01 06:16:43
【问题描述】:

我有这个匿名块:

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

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

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

【问题讨论】:

  • 随机日期在什么范围内?是否可以接受任何有效的日期值,以便您生成的大部分日期都是 B.C.相对较小的一部分将在 20 世纪或 21 世纪?您是否希望时间组件也是随机的,或者您希望日期在您的示例中的午夜?
  • 对!例如,从 01-01-2000 开始的随机日期。这可能吗?
  • 时间分量可以是随机的。没问题。我只对日期感兴趣。
  • 好的。这回答了范围的下限。范围的上限是多少?还是您想要截至 9999 年 12 月 31 日的值?
  • 上限不重要

标签: oracle date random plsql database


【解决方案1】:

这里还有一个选项可以生成从现在开始返回的日期,其中 365 天数量从今天开始返回,'DD.MM.YYYY'- 掩码

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

【讨论】:

    【解决方案2】:

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

      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】:

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

      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
      

      【讨论】:

        【解决方案4】:

        您可以在两个日期之间生成随机日期,如下面的查询所示。随机日期在 2000 年 1 月 1 日到 9999 年 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,第二个值是 31-dec-9999

        【讨论】:

        • 我在编译时得到这个错误:ORA-01843: mese non valido ORA-06512: a line 4。这意味着该月份无效。
        • +1.. 我确实编辑了第一个示例以明确指定日期格式掩码,这将允许它在不考虑 NLS 设置的情况下工作。我想这就是@sharkbait 获得 ORA-01843 的原因。
        • 我用 ANSI 日期文字替换了 TO_DATE。它更短,并且避免了TO_DATE 的许多潜在问题。
        猜你喜欢
        • 2015-08-16
        • 2022-01-23
        • 1970-01-01
        • 2014-02-25
        • 2013-05-10
        • 2014-09-25
        • 2015-06-03
        • 1970-01-01
        相关资源
        最近更新 更多