Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
хорошо я согласен Member Откуда: Сообщений: 393 |
Я тут задавал вопрос, пытаясь задачу решить самому. Но что-то никак. Есть таблица работы конвейера. Работает он круглосуточно, но для простоты пусть с 6 утра до полуночи. Что-то на нём делают, останавливают, меняют продукцию, снова запускают.
Задача вывести эту таблицу в виде
Сообщение было отредактировано: 5 авг 19, 14:58 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5 авг 19, 14:49 [21942112] Ответить | Цитировать Сообщить модератору |
StarikNavy Member Откуда: Москва Сообщений: 2396 |
хорошо я согласен, джойн к таблице "отрезков" и группировка |
5 авг 19, 15:06 [21942130] Ответить | Цитировать Сообщить модератору |
982183 Member Откуда: VL Сообщений: 3374 |
Не вижу связи между тестовыми данными и тестовой результирующей табличкой |
5 авг 19, 15:20 [21942150] Ответить | Цитировать Сообщить модератору |
Minamoto Member Откуда: Москва Сообщений: 1162 |
хорошо я согласен,declare @t table ( state_name nvarchar(100), team_id int, dt datetime ); insert into @t (state_name,team_id, dt) values ('запуск' , 1, convert(datetime, '11.02.2018 6:10' , 104)), ('простой', 1, convert(datetime, '11.02.2018 9:40' , 104)), ('запуск' , 1, convert(datetime, '11.02.2018 9:55' , 104)), ('простой', 1, convert(datetime, '11.02.2018 13:30', 104)), ('запуск' , 1, convert(datetime, '11.02.2018 14:10', 104)), ('простой', 1, convert(datetime, '11.02.2018 23:12', 104)), ('запуск' , 1, convert(datetime, '12.02.2018 6:05' , 104)), ('простой', 1, convert(datetime, '12.02.2018 8:30' , 104)), ('запуск' , 1, convert(datetime, '12.02.2018 8:55' , 104)), ('простой', 1, convert(datetime, '12.02.2018 12:20', 104)), ('запуск' , 1, convert(datetime, '12.02.2018 15:50', 104)), ('простой', 1, convert(datetime, '12.02.2018 23:58', 104)); with periods as ( select *, lead(dt) over (partition by team_id order by dt) as dt_to from @t), calendar as ( select cast('20180211 06:00' as datetime) as dt, cast('20180211 06:30' as datetime) as dt_to union all select dateadd(mi, 30, dt) as dt, dateadd(mi, 30, dt_to) as dt_to from calendar where dateadd(mi, 30, dt) < '20180212' ) select c.dt, sum(datediff(mi, iif(c.dt > p.dt, c.dt, p.dt), iif(c.dt_to > p.dt_to, p.dt_to, c.dt_to))) from calendar c left join periods p on state_name = 'запуск' and p.dt < c.dt_to and p.dt_to > c.dt group by c.dt Для реального применения календарь желательно в отдельную таблицу вынести. Окончание считается исходя из условия, что дубли вы уже удалили. |
5 авг 19, 15:28 [21942162] Ответить | Цитировать Сообщить модератору |
хорошо я согласен Member Откуда: Сообщений: 393 |
в исходных данных: в 6:10 конвейер запустили, в 9:40 остановили для переналадки. Т.е. с 6:00 до 6:29 он работал всего 20 минут. с 6:30 до 6:59 он работал всего 50 минут. ... с 9:30 до 9:59 он работал всего 10 минут, затем ещё 5. Т.е. 15. И т.д. |
||
5 авг 19, 15:28 [21942163] Ответить | Цитировать Сообщить модератору |
PizzaPizza Member Откуда: Сообщений: 415 |
простой это вам не сложный,
отрезок только ничего в реальном мире выражается одной точкой
так сразу понятнее будет что надо делать |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
6 авг 19, 05:27 [21942560] Ответить | Цитировать Сообщить модератору |
AlexKM2020 Member Откуда: Сообщений: 36 |
Можно так ещё )))declare @t table ( ID int identity(1,1), state_name nvarchar(100), team_id int, dt datetime ); insert into @t (state_name,team_id, dt) values ('запуск' , 1, convert(datetime, '05.08.2019 6:10' , 104)), ('останов', 1, convert(datetime, '05.08.2019 9:40' , 104)), ('запуск' , 1, convert(datetime, '05.08.2019 9:55' , 104)), ('останов', 1, convert(datetime, '05.08.2019 13:30', 104)), ('запуск' , 1, convert(datetime, '05.08.2019 14:10', 104)), ('останов', 1, convert(datetime, '05.08.2019 23:12', 104)), ('запуск' , 1, convert(datetime, '06.08.2019 6:05' , 104)), ('останов', 1, convert(datetime, '06.08.2019 8:30' , 104)), ('запуск' , 1, convert(datetime, '06.08.2019 8:55' , 104)), ('останов', 1, convert(datetime, '06.08.2019 12:20', 104)), ('запуск' , 1, convert(datetime, '06.08.2019 15:50', 104)), ('останов', 1, convert(datetime, '06.08.2019 23:58', 104)); select t1.ID ,datediff(minute, t1.dt, isnull(t2.dt, cast(cast(getdate()+1 as date) as datetime))) as 'время работы' ,t1.dt as 'запуск' ,isnull(t2.dt, cast(cast(getdate()+1 as date) as datetime)) as 'останов' from @t t1 left join @t t2 on t1.ID = t2.ID - 1 |
6 авг 19, 10:14 [21942652] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |