MySQL получить временные слоты на основе времени начала и времени окончания

Вопрос или проблема

Мне нужна помощь в подготовке запроса, который предоставит мне 30-минутные временные промежутки на основе времени начала и времени окончания.

Например,

В моем запросе в условии между я укажу дату начала как 2024-11-13 00:00:00 и дату окончания как 2024-11-13 02:00:00.

Результат запроса должен быть следующим:

****время начала   время окончания****

2018-03-12 00:00:00 2018-03-12 00:30:00
2018-03-12 00:30:00 2018-03-12 01:00:00
2018-03-12 01:00:00 2018-03-12 01:30:00
2018-03-12 01:30:00 2018-03-12 02:00:00

Вы можете попробовать этот подход:

WITH RECURSIVE временные_промежутки AS (
    -- Начальный элемент: Точка начала временных промежутков (указанная дата начала)
    SELECT 
        CAST('2024-11-13 00:00:00' AS DATETIME) AS время_начала,
        DATE_ADD(CAST('2024-11-13 00:00:00' AS DATETIME), INTERVAL 30 MINUTE) AS время_окончания
    UNION ALL
    -- Рекурсивный элемент: Добавляем 30 минут к каждому предыдущему промежутку
    SELECT 
        DATE_ADD(время_начала, INTERVAL 30 MINUTE),
        DATE_ADD(время_окончания, INTERVAL 30 MINUTE)
    FROM 
        временные_промежутки
    -- Останавливаем рекурсию, если время окончания превышает указанную дату окончания
    WHERE 
        время_окончания < '2024-11-13 02:00:00'
)
-- Выбрать сгенерированные временные промежутки
SELECT время_начала, время_окончания
FROM временные_промежутки
ORDER BY время_начала;

источник: https://sqlize.online/sql/mariadb115/ad0e87fbc2b8c8a01615acec7595a0f7/

Ответ или решение

Получение временных слотов в MySQL на основе даты и времени

В данной статье мы рассмотрим, как создать запрос в MySQL для получения временных слотов длительностью 30 минут в заданном диапазоне времени. Пример, который мы будем использовать, основан на временных метках: 2024-11-13 00:00:00 (начало) и 2024-11-13 02:00:00 (конец).

Шаг 1: Использование Рекурсивного CTE

Для генерации временных слотов мы воспользуемся рекурсивным общим табличным выражением (CTE). Это эффективный способ создавать наборы данных, которые зависят от других строк в том же наборе.

Вот пример запроса, который решает данную задачу:

WITH RECURSIVE time_slots AS (
    -- Основная часть: определяем начальную точку временных слотов (начальная дата)
    SELECT 
        CAST('2024-11-13 00:00:00' AS DATETIME) AS starttime,
        DATE_ADD(CAST('2024-11-13 00:00:00' AS DATETIME), INTERVAL 30 MINUTE) AS endtime
    UNION ALL
    -- Рекурсивная часть: добавляем 30 минут к каждому предыдущему слоту
    SELECT 
        DATE_ADD(starttime, INTERVAL 30 MINUTE),
        DATE_ADD(endtime, INTERVAL 30 MINUTE)
    FROM 
        time_slots
    -- Остановка рекурсии, если endtime превышает указанную конечную дату
    WHERE 
        endtime < '2024-11-13 02:00:00'
)
-- Выбор сгенерированных временных слотов
SELECT starttime, endtime
FROM time_slots
ORDER BY starttime;

Объяснение Запроса

  1. Секция WITH RECURSIVE: Начинается с определения временного слота с заданным начальным временем и вычисляет его конечное время, добавляя 30 минут.

  2. UNION ALL: Позволяет рекурсивно добавлять новые временные слоты, извлекая предыдущее значение starttime и вызывая DATE_ADD для создания нового слота.

  3. WHERE endtime < ‘2024-11-13 02:00:00’: Это условие останавливает рекурсию, когда конечное время слота превышает указанное время конца.

  4. Финальный SELECT: Извлекает все элементы из CTE и сортирует их по времени начала.

Результат Запроса

Запрос вернет временные слоты следующего вида:

****starttime          endtime****
2024-11-13 00:00:00   2024-11-13 00:30:00
2024-11-13 00:30:00   2024-11-13 01:00:00
2024-11-13 01:00:00   2024-11-13 01:30:00
2024-11-13 01:30:00   2024-11-13 02:00:00

Заключение

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

SEO-ОПТИМИЗАЦИЯ

Настоящая статья предназначена для информационной поддержки пользователей MySQL, которым требуется помощь в создании запросов для генерации временных слотов. Использование ключевых слов, таких как "MySQL", "временные слоты", "интервал времени", "рекурсивный CTE", позволяет улучшить видимость статьи в поисковых системах и привлечь больше целевой аудитории.

Оцените материал
Добавить комментарий

Капча загружается...