2013-07-03 4 views
10

je ce bloc anonyme:Générer une date aléatoire dans Oracle avec DBMS_RANDOM

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

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

mais je pour générer la date d'une manière aléatoire. Comment puis-je faire?

+0

Une date aléatoire dans quelle plage? Est-ce qu'une valeur de date valide est acceptable pour qu'une grande partie des dates que vous générez soit B.C. et une fraction relativement petite sera au 20ème ou 21ème siècle? Voulez-vous que le composant de temps soit également aléatoire ou voulez-vous que les dates soient à minuit comme dans votre exemple? –

+0

Droit! Par exemple une date aléatoire du 01-01-2000 et le. C'est possible? – sharkbait

+0

La composante de temps pourrait être aléatoire. Aucun problème. Je ne m'intéresse qu'à la date. – sharkbait

Répondre

23

Vous pouvez générer des dates aléatoires entre deux dates, comme indiqué dans la requête ci-dessous les dates .Random sont générés entre 1-jan-2000 et le 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; 

OU vous pouvez utiliser

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

Dans l'exemple ci-dessus, la première valeur est 01-Jan-2000 et le second identifiant de valeur 31-déc-9999

+0

J'obtiens cette erreur lorsque je compile: ORA-01843: mese non valido ORA-06512: une ligne 4. Cela signifie que le mois n'est pas valide. – sharkbait

+0

Pouvez-vous m'expliquer ces solutions? La deuxième ... quels sont ces chiffres? – sharkbait

+0

@pouvez-vous me montrer votre code? –

3

Pour générer la date aléatoire, vous pouvez utiliser

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

ou pour datetime aléatoire

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

Si vous voulez voir c'est logique, vous pouvez également utiliser ce code.

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; 
Questions connexes