Я хочу сгенерировать время, чтобы создать расписание, в котором есть несколько мест, которые необходимо проверить.
Представьте себе тюремного охранника, который должен ходить по тюрьме и проверять каждую камеру. Расписание запустится в случайное время MMDDYYYY HH24: MI, а затем будет от 6 до 10 минут, чтобы проверить следующую ячейку, после этого 6-10 минут, чтобы проверить ячейку, после этого и так далее, и так до завершения расписания.
Позвольте мне проиллюстрировать на простом примере.
Schedule_id location_id Schedule_time
1100 07132020 16: 10: 00
- начало расписания
1 103 07132020 16: 07: 00
- охрана должна быть в ячейке 103 к 16: 07
1110 07132020 16: 16: 00
- охрана должна быть в позиции 110 к 16:16
Поскольку я произвольно сгенерировал 3 строки для расписания 1, это завершено, я создаю следующее расписание.
- начало расписания, но скажем, я произвольно СОЗДАЛ 5 строк для этого расписания.
2 102 07132020 23: 46: 00
- охранник должен быть в позиции 102 к 23: 46
2 104 07132020 23: 56: 00
- охранник должен быть на позиции 104 к 23: 56
- ПОДОЖДИТЕ !! Я сгенерировал 5 строк для расписания 2, но следующий интервал пересечет полночь, поэтому я останавливаюсь на 2 строках, а затем go, чтобы создать следующее расписание в каком-то случайном HH24: MI, но MMDDYYYY все равно будет тем же самым 07132020.
СТОП-ПРОБЕЛ: либо мы заполнили строки значениями времени, либо он не может пересечь полночь !!
- начало нового расписания. Обратите внимание на то же MMDDYYYY
3 223 07132020 02: 04: 00
3 143 07132020 02: 11: 00
3 46 07132020 02: 17: 00
Ваш первый пример был почти готов, за исключением того, что не было НЕОБХОДИМОСТИ ОСТАНОВКИ, чтобы предотвратить его пересечение полуночи и создание следующего расписания.
У меня тоже есть таблица местоположений, в которой я хочу случайным образом выбрать location_id, но я не могу используйте dbms_random, поскольку значения не нумеруются последовательно. Я постараюсь понять это. Я упоминаю об этом, чтобы завершить сценарий.
CREATE TABLE schedule_hdr AS
SELECT level AS schedule_id,
'Schedule ' || level AS schedule_name
FROM dual
CONNECT BY level <= 10;
CREATE TABLE locations(
location_id NUMBER(4),
location_name VARCHAR2(30)
);
INSERT INTO locations (
location_id,
location_name
)
VALUES
(46, 'Door 1');
INSERT INTO locations (
location_id,
location_name
)
VALUES
(143, 'Door 2');
INSERT INTO locations (
location_id,
location_name
)
VALUES
(223, 'Door 3');
WITH random_times ( schedule_id, schedule_name, datetime, lvl ) AS (
SELECT schedule_id,
schedule_name,
TRUNC(sysdate)
+ NUMTODSINTERVAL( FLOOR(DBMS_RANDOM.VALUE(0,23*60)), 'MINUTE' ),
1
FROM schedule_hdr
UNION ALL
SELECT schedule_id,
schedule_name,
datetime + NUMTODSINTERVAL(FLOOR(DBMS_RANDOM.VALUE(6,11)), 'MINUTE'),
lvl + 1
FROM random_times
WHERE lvl < 5
)
SELECT schedule_id,
schedule_name,
datetime
FROM random_times
ORDER BY schedule_id, datetime;
Моя первая попытка, но дата есть. всегда случайный и без интервала
WITH rws as ( select level rn from dual connect by level <= 5 ),
scheds as ( select sh.*, round (dbms_random.value(1,5) ) n from schedule_hdr sh )
select schedule_id,
TRUNC(sysdate) + DBMS_RANDOM.value(0,86400)/86400
from rws
join scheds s on rn <= n
Order by schedule_id;