2013-07-03 51 views
10

Tôi có khối ẩn danh này:Tạo một ngày ngẫu nhiên trong Oracle với DBMS_RANDOM

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

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

nhưng tôi sẽ để tạo ra ngày một cách ngẫu nhiên. Làm thế nào tôi có thể làm được?

+0

Một ngày ngẫu nhiên trong phạm vi nào? Có thể chấp nhận bất kỳ giá trị ngày hợp lệ nào để một phần lớn các ngày bạn tạo sẽ là B.C. và một phần tương đối nhỏ sẽ vào thế kỷ 20 hoặc 21? Bạn có muốn thành phần thời gian là ngẫu nhiên hay bạn muốn ngày tháng vào lúc nửa đêm như trong ví dụ của bạn? –

+0

Phải! Ví dụ: một ngày ngẫu nhiên từ ngày 01-01-2000 trở đi. Điều này có thể không? – sharkbait

+0

Thành phần thời gian có thể là ngẫu nhiên. Không vấn đề gì. Tôi chỉ quan tâm đến ngày tháng. – sharkbait

Trả lời

23

Bạn có thể tạo ngày ngẫu nhiên giữa hai ngày, như được hiển thị trong truy vấn dưới Ngày .Random được tạo ra giữa 1-Jan-2000 và 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; 

HOẶC bạn có thể sử dụng

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

Trong ví dụ trên, giá trị đầu tiên là 01-Jan-2000 và id giá trị thứ hai 31-Dec-9999

+0

Tôi gặp lỗi này khi biên dịch: ORA-01843: mese non valido ORA-06512: dòng 4. Điều này có nghĩa là tháng đó không hợp lệ. – sharkbait

+0

Bạn có thể giải thích cho tôi những giải pháp này không? Thứ hai ... những con số này là gì? – sharkbait

+0

@ bạn có thể chỉ cho tôi mã của bạn không? –

3

Để tạo ngày ngẫu nhiên bạn có thể sử dụng

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

hoặc cho datetime ngẫu nhiên

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

Nếu bạn muốn nhìn thấy nó là logic, bạn cũng có thể sử dụng mã này.

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;