Генерация случайной даты в PostgreSQL: функция random()
Быстрый ответ
Для генерации случайной временной метки в указанном диапазоне можно использовать функцию RANDOM()
и операции с интервалами времени. Примените формулу НАЧАЛО + (КОНЕЦ – НАЧАЛО) * RANDOM()
, позволяющую равномерно распределить моменты по интервалу.
Ниже представлен пример SQL-запроса:
SELECT
'2023-01-01 00:00:00'::timestamp +
('2023-12-31 23:59:59'::timestamp – '2023-01-01 00:00:00'::timestamp) *
RANDOM() AS random_timestamp;
Данный запрос вернёт случайную дату и время в пределах периода с 1 января по 31 декабря 2023 года.
Погрузимся в детали
"Магию" функции RANDOM()
можно объяснить следующим образом: эта функция возвращает псевдослучайное число в диапазоне от 0 до 1. Умножив это число на временной интервал и прибавив результат к начальной дате, вы получите случайный момент времени внутри данного интервала.
Обратите внимание: для корректных вычислений начальная и конечная точки должны быть в формате timestamp. Если у вас имеются строки, преобразуйте их следующим образом:
'ГГГГ-ММ-ДД ЧЧ:ММ:СС'::timestamp
Чтобы повысить эффективность, можно создать небольшую SQL-функцию для многократной генерации случайных моментов времени.
Хотя использование generate_series()
для больших интервалов может замедлить выполнение запроса, рекомендуется придерживаться вышеописанного метода.
Адаптация под ваш временной диапазон
Метод легко адаптировать под ваши потребности, заменив в примере SQL-запроса используемые даты на свои:
Для определённых часов можно использовать такой запрос:
SELECT
'2023-01-01 08:00:00'::timestamp +
('2023-01-01 17:00:00'::timestamp – '2023-01-01 08:00:00'::timestamp) *
RANDOM() AS random_work_hour_timestamp;
А для нескольких дней такой:
SELECT
'2023-06-01 00:00:00'::timestamp +
('2023-06-07 23:59:59'::timestamp – '2023-06-01 00:00:00'::timestamp) *
RANDOM() AS random_full_week_timestamp;
Помните о необходимости тестирования запросов для разнообразных интервалов времени, регулируя их под конкретные задачи.
Структура: сохраняйте корректность запроса
Чтобы поддерживать идеальную структуру SQL-запроса, следуйте рекомендациям:
- Начните с ключевого слова
SELECT
. - Выполняйте расчёты внутри инструкции
SELECT
. - Используйте скобки для ясности последовательности операций.
- Заканчивайте запрос псевдонимом для лучшей читаемости.
Учёт рабочего времени
Если нужно учесть рабочие часы, примените условную логику в запросах:
SELECT
ts
FROM (
SELECT
'2023-01-01'::date + (RANDOM() *
('2023-12-31'::date – '2023-01-01'::date + 1)) AS ts
) AS r
WHERE
EXTRACT('ISODOW' FROM ts) < 6 AND
ts::time BETWEEN '09:00' AND '17:00';
Этот запрос даст возможность выбирать временную метку в рабочие часы с понедельника по пятницу.
Визуализация
Схематическое представление процесса выглядит так:
Капсула времени (🕰️): [Начальная дата 🌅, ..., Конечная дата 🌆]
Выбираем случайный момент так:
SELECT TIMESTAMP 'Начальная дата'
+ RANDOM() * (EXTRACT(EPOCH FROM TIMESTAMP 'Конечная дата' – TIMESTAMP 'Начальная дата') * INTERVAL '1 second')
Это напоминает лотерею:
🌅-----------🎰-------------🌆
(Случайная билет: 🎟️ = 🕒)
Каждый выбор – это уникальный шанс определить момент в пределах нашей временной капсулы.
Рекомендации по генерации интервалов
- Для точных расчётов используйте конвертацию в EPOCH.
- Учитывайте часовые пояса, работая с датами и временем.
- Проверяйте диапазоны на корректность перед их генерацией, чтобы предотвратить ошибки.
- Индексация столбцов с временными метками существенно улучшит производительность запроса.
Полезные материалы
- PostgreSQL: Документация – Математические функции и операторы — Официальная документация PostgreSQL по функциям случайных чисел.
- Случайные значения – вики PostgreSQL — Детальное руководство по генерации случайных значений в PostgreSQL.
- PostgreSQL: Документация – Функции и операторы даты/времени — Основная информация о функциях даты и времени для работы с временными метками.