Вычислить время начала и окончания в выбранном запросе - PullRequest
0 голосов
/ 17 июня 2020
with cte as (
Select 1 as order_num, 'Audi' as car, 7 as total_minutes, null as start_time, null as end_time
union all
Select 2 as order_num, 'BMW' as car, 15 as total_minutes, null as start_time, null as end_time
union all
Select 3 as order_num, 'Mercedes' as car, 5 as total_minutes, null as start_time, null as end_time
)
Select * from cte order by order_num

Как заполнить start_time и end_time в запросе, например. Начало всегда 06:00 для order_num = 1 end_time: 06:00 + 7 = 06:07 .... Начало второй строки в 06:07 ......

Это нужно как вывод:

1   Audi          7    06:00    06:07
2   BMW           15   06:07    06:22
3   Mercedes      5    06:22    06:27

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Немного другой метод, используя ROWS_BETWEEN:

SELECT order_num,
       car,
       total_minutes,
       DATEADD(MINUTE,ISNULL(SUM(total_minutes) OVER (ORDER BY order_num ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING),0),CONVERT(time,'06:00')),
       DATEADD(MINUTE,ISNULL(SUM(total_minutes) OVER (ORDER BY order_num ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW),0),CONVERT(time,'06:00'))
FROM CTE
ORDER BY order_num
1 голос
/ 17 июня 2020

Вы можете использовать оконные функции и dateadd():

select cte.*,
       dateadd(minute,
               sum(total_minutes) over (order by order_num) - total_minutes,
               convert(time, '06:00:00')
              ) as start_time,
       dateadd(minute,
               sum(total_minutes) over (order by order_num),
               convert(time, '06:00:00')
              ) as end_time
from cte;

Здесь - это скрипт db <>.

sum(total_minutes) over (order by order_num) выполняет совокупную сумму минут. Остальное просто прибавляет это к базовому времени. И для времени начала вычитается время в текущей строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...