Как развернуть таблицу так, чтобы каждая строка была между двумя разами?

#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 в любом случае не поддерживался , так что это было мудрое решение для обновления