У меня есть этот анонимный блок:
DECLARE
V_DATA DATE;
BEGIN
V_DATA := '01-GEN-2000';
HR.STATISTICHE.RATINGOPERATORI (V_DATA);
COMMIT;
END;
но я хотел бы генерировать дату случайным образом. Как я могу сделать?
У меня есть этот анонимный блок:
DECLARE
V_DATA DATE;
BEGIN
V_DATA := '01-GEN-2000';
HR.STATISTICHE.RATINGOPERATORI (V_DATA);
COMMIT;
END;
но я хотел бы генерировать дату случайным образом. Как я могу сделать?
Вы можете создавать случайные даты между двумя датами, как показано в запросе ниже. Сроки рандомизации генерируются между 1-ян-2000 и 31-дек-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
В приведенном выше примере первое значение - 01-янв-2000, а второе значение id 31-dec-9999
Для генерации случайной даты вы можете использовать
select to_date('2010-01-01', 'yyyy-mm-dd')+trunc(dbms_random.value(1,1000)) from dual
или для случайного datetime
select to_date('2010-01-01', 'yyyy-mm-dd')+dbms_random.value(1,1000) from dual
Если вы хотите увидеть его логическим, вы также можете использовать этот код.
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;
Вот еще одна опция для создания даты, возвращающейся с этого момента, где 365-дневное количество для перехода назад с сегодняшнего дня, 'ДД.ММ.ГГГГ' - маска
to_char(sysdate-dbms_random.value()*365, 'DD.MM.YYYY')