ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Генерация случайной даты в PostgreSQL: функция random()

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для генерации случайной временной метки в указанном диапазоне можно использовать функцию RANDOM() и операции с интервалами времени. Примените формулу НАЧАЛО + (КОНЕЦ – НАЧАЛО) * RANDOM(), позволяющую равномерно распределить моменты по интервалу.

Ниже представлен пример SQL-запроса:

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 года.

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Погрузимся в детали

"Магию" функции RANDOM() можно объяснить следующим образом: эта функция возвращает псевдослучайное число в диапазоне от 0 до 1. Умножив это число на временной интервал и прибавив результат к начальной дате, вы получите случайный момент времени внутри данного интервала.

Обратите внимание: для корректных вычислений начальная и конечная точки должны быть в формате timestamp. Если у вас имеются строки, преобразуйте их следующим образом:

SQL
Скопировать код
'ГГГГ-ММ-ДД ЧЧ:ММ:СС'::timestamp

Чтобы повысить эффективность, можно создать небольшую SQL-функцию для многократной генерации случайных моментов времени.

Хотя использование generate_series() для больших интервалов может замедлить выполнение запроса, рекомендуется придерживаться вышеописанного метода.

Адаптация под ваш временной диапазон

Метод легко адаптировать под ваши потребности, заменив в примере SQL-запроса используемые даты на свои:

Для определённых часов можно использовать такой запрос:

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;

А для нескольких дней такой:

SQL
Скопировать код
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.
  • Используйте скобки для ясности последовательности операций.
  • Заканчивайте запрос псевдонимом для лучшей читаемости.

Учёт рабочего времени

Если нужно учесть рабочие часы, примените условную логику в запросах:

SQL
Скопировать код
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';

Этот запрос даст возможность выбирать временную метку в рабочие часы с понедельника по пятницу.

Визуализация

Схематическое представление процесса выглядит так:

Капсула времени (🕰️): [Начальная дата 🌅, ..., Конечная дата 🌆]

Выбираем случайный момент так:

SQL
Скопировать код
SELECT TIMESTAMP 'Начальная дата'
       + RANDOM() * (EXTRACT(EPOCH FROM TIMESTAMP 'Конечная дата' – TIMESTAMP 'Начальная дата') * INTERVAL '1 second')

Это напоминает лотерею:

🌅-----------🎰-------------🌆
(Случайная билет: 🎟️ = 🕒)

Каждый выбор – это уникальный шанс определить момент в пределах нашей временной капсулы.

Рекомендации по генерации интервалов

  • Для точных расчётов используйте конвертацию в EPOCH.
  • Учитывайте часовые пояса, работая с датами и временем.
  • Проверяйте диапазоны на корректность перед их генерацией, чтобы предотвратить ошибки.
  • Индексация столбцов с временными метками существенно улучшит производительность запроса.

Полезные материалы

  1. PostgreSQL: Документация – Математические функции и операторы — Официальная документация PostgreSQL по функциям случайных чисел.
  2. Случайные значения – вики PostgreSQL — Детальное руководство по генерации случайных значений в PostgreSQL.
  3. PostgreSQL: Документация – Функции и операторы даты/времени — Основная информация о функциях даты и времени для работы с временными метками.