2013-07-03 18 views
10

mam ten anonimowy blok:wygenerować losowy datę w Oracle DBMS_RANDOM

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

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

ale chciałbym wygenerować datę w sposób losowy. Jak mogę zrobić?

+0

Losowa data w jakim zakresie? Czy jakakolwiek poprawna wartość daty jest akceptowalna, więc duża część dat, które wygenerujesz, będzie B.C. a stosunkowo niewielka część będzie w XX lub XXI wieku? Czy chcesz, aby składnik czasu był losowy, czy chcesz, aby daty były o północy, jak w twoim przykładzie? –

+0

Dobrze! Na przykład losowa data od 01-01-2000 i dalej. To jest możliwe? – sharkbait

+0

Komponent czasu może być losowy. Nie ma problemu. Jestem zainteresowany tylko datą. – sharkbait

Odpowiedz

23

Można wygenerować losowe daty pomiędzy dwiema datami, jak wyświetlane w zapytaniu poniżej .Random Daty są generowane między 1 stycznia 2000 a 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; 

lub można użyć

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

W powyższym przykładzie, pierwsza wartość jest 01-sty-2000 i druga wartość id 31-Dec-9999

+0

Ten błąd jest wyświetlany podczas kompilacji: ORA-01843: mese non valido ORA-06512: linia 4. Oznacza to, że miesiąc jest nieprawidłowy. – sharkbait

+0

Czy możesz wyjaśnić mi te rozwiązania? Drugi .... jakie są te liczby? – sharkbait

+0

@ możesz pokazać mi swój kod? –

3

do generowania losowych datę można użyć

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

lub losowej datetime

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

Jeśli chcesz zobaczyć to logika, można również użyć tego kodu.

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; 
Powiązane problemy