#mysql #sql
Вопрос:
Приношу извинения за плохо сформулированный вопрос, надеюсь, я смогу лучше объяснить его здесь.
У меня есть таблица «вакансии» с указанием времени начала и окончания. Я пытаюсь разложить таблицу так, чтобы каждая строка соответствовала 30-минутному периоду времени, который приходится на время между началом и окончанием.
Например, если задание начинается в 10:45 и заканчивается в 13:10, мой первый стол будет выглядеть так:
количество рабочих мест | стартр | стартмин | endhr | конец минуты |
---|---|---|---|---|
12345 | 10 | 45 | 13 | 10 |
Я хотел бы расширить эту единственную строку, чтобы она выглядела примерно так:
количество рабочих мест | время |
---|---|
12345 | 10:30 |
12345 | 11:00 |
12345 | 11:30 |
12345 | 12:00 |
12345 | 12:30 |
12345 | 13:00 |
Я добился этого, создав CROSS JOIN
таблицу с различными временными сегментами, за которой следует CASE
отфильтровать правильные совпадения, но мне любопытно посмотреть, есть ли лучший подход.
Я использую MySQL 5.6.
Я прикрепил базовую схему ниже для удобства.
CREATE TABLE jobs (
jobnumber INTEGER,
starthr INTEGER,
startmin INTEGER,
endhr INTEGER,
endmin INTEGER
);
-- job #12345 starts at 10:45 and ends 13:10
INSERT INTO jobs VALUES (12345, 10, 45, 13, 10);
Ответ №1:
другой способ-использовать recursive cte
:
with recursive cte as(
select jobnumber
, cast(concat(starthr,':',case when startmin < 30 then 0 else 30 end) as time) starttime
, cast(concat(endhr,':',case when endmin < 30 then 0 else 30 end) as time) endtime
from jobs
union all
select jobnumber, starttime interval 30 minute , endtime
from cte
where starttime interval 30 minute <= endtime
)
select jobnumber,starttime from cte
order by jobnumber,starttime;
бд<>скрипка <>здесь
Комментарии:
1. это сработало, спасибо! Первоначально я использовал версию v5.6, которая не поддерживала рекурсивный CTE, поэтому мне пришлось обновить ее до последней версии, чтобы все заработало.
2. oh 5.6 в любом случае не поддерживался , так что это было мудрое решение для обновления