Получить сумму минут из записей в таблице без расчета перекрытия разных записей в SQL - PullRequest
1 голос
/ 08 мая 2019

Я хочу вычислить сумму минут между двумя датами из таблицы без наложения (объяснение ниже после данных таблицы) **

**Id**        **timeStart**            **timeEnd**          **ReaderId**
3          2019-04-11 21:50:00.00   2019-04-11 22:00:00.00       24 
4          2019-04-11 22:30:00.00   2019-04-11 22:35:00.00       24 
5          2019-04-11 22:31:00.00   2019-04-11 22:33:00.00       22 
6          2019-04-11 21:40:00.00   2019-04-11 21:55:00.00       22 

** Как видно из приведенных выше данных, у нас есть двачитатели и я хочу получить сумму минут от всех записей.например, 3 и 6 строк, в 6-м идентификаторе время начинается с 21:40 и заканчивается в 21:55, а в 3-м идентификаторе - с 21:50 до 22:00. Таким образом, он должен считаться только с 21:40 до 22:00, поэтому вывод должен быть 20 минут.Не следует считать их вдвое (21: 40-21: 55) = 15 + (21: 50-22: 00) = 10 = 25. Нужно сосчитать пересекающиеся минуты один раз

Я неконечно, как я могу это сделать.Ниже я знаю, как получить время между двумя датами, но не уверен, как мне преодолеть точку перекрытия.

(datediff(minute, @dt_start, @dt_end))

ОБНОВЛЕНИЕ:

из приведенных выше данных в таблице: 25Минутой должен быть вывод, как описано ниже: Исходные данные

21:50 - 22:00
22:30 - 22:35
22:31 - 22:33
21:40 - 21:55

перестановка для более легкого понимания:

21:40 - 21:55
21:50 - 22:00 
22:30 - 22:35
22:31 - 22:33

В первых двух строках время равноначиная с 21:40, а максимальное время окончания - 22:00, поэтому результат будет 20 + 5 (из последних двух строк) = 25 минут.

Ответы [ 3 ]

1 голос
/ 08 мая 2019

Я должен заставить его работать с запросом ниже:

Declare @Terms table (Start DATETIME, Finish DATETIME)
INSERT INTO @Terms values
('2019-04-11 21:50:00.00','2019-04-11 22:00:00.00'),
('2019-04-11 22:30:00.00','2019-04-11 22:35:00.00'),
('2019-04-11 22:31:00.00','2019-04-11 22:33:00.00'),   -- overlapping term
('2019-04-11 21:40:00.00','2019-04-11 21:55:00.00')

Select Minutes = sum(Minutes) From (
    Select Distinct 
           B.DateR1
          ,B.DateR2
          ,Minutes = DateDiff(Minute,B.DateR1,B.DateR2)
     From @Terms A
     Cross Apply (
                  Select DateR1=Min(Start)
                        ,DateR2=max(Finish) 
                   From  @Terms 
                   Where Start <= A.Finish and Finish >= A.Start
                 ) B
 ) A

Счастливое кодирование

0 голосов
/ 08 мая 2019

Ответ:

select id, ReaderId, (datediff(minute, isnull(dataset.start_calc, dataset.timeStart), isnull(dataset.end_calc,dataset.timeEnd))) Time_in_minuts
from ( 
select id, 
    a.timeStart  ,
    a.timeend  ,
    (select b.timeEnd  from Reader_timings b where a.id <> b.id and a.ReaderId  = b.ReaderId and b.timeStart between a.timeStart and a.timeEnd) 'start_calc' ,
    (select a.timeEnd from Reader_timings b where a.id <> b.id and a.ReaderId  = b.ReaderId and b.timeEnd between a.timeStart and A.timeEnd  ) 'end_calc',
    ReaderId
from Reader_timings a)
as dataset

Это будет полезно для вас.проверено на

create table Reader_timings (id int, timeStart datetime, timeEnd datetime , ReaderId int)

insert into Reader_timings  values (3          ,'2019-04-11 21:50:00.00'   ,'2019-04-11 22:00:00.00'       ,24 )
insert into Reader_timings  values (4 ,         '2019-04-11 22:30:00.00',   '2019-04-11 22:35:00.00',       24 )
insert into Reader_timings  values (5 ,         '2019-04-11 22:31:00.00',   '2019-04-11 22:33:00.00',       22 )
insert into Reader_timings  values (6 ,         '2019-04-11 21:40:00.00',   '2019-04-11 22:55:00.00',       22 )
0 голосов
/ 08 мая 2019

Продолжая ваш пример, я сделал простой пример.Предполагая, что вы хотите, чтобы каждый ReaderId

SELECT a.ReaderId, a.startDate, a.endDate
INTO #temp
FROM (
SELECT '2019-04-11 21:50:00.00' startDate, '2019-04-11 22:00:00.00' endDate,  24 ReaderId union
SELECT '2019-04-11 22:30:00.00' startDate, '2019-04-11 22:35:00.00' endDate,  24 ReaderId union
SELECT '2019-04-11 22:31:00.00' startDate, '2019-04-11 22:33:00.00' endDate,  22 ReaderId union
SELECT '2019-04-11 21:40:00.00' startDate, '2019-04-11 21:55:00.00' endDate,  22 ReaderId
) a

SELECT ReaderId, MIN(startDate) StartDate, MAX(endDate) EndDate, DATEDIFF(MINUTE, MIN(startDate), MAX(endDate)) TotalMinutes
FROM #temp
GROUP BY ReaderId

DROP TABLE #temp

В этом случае он вернет следующий результат:

ReaderId    StartDate                 EndDate                TotalMinutes
  22      2019-04-11 21:40:00.00    2019-04-11 22:33:00.00     53
  24      2019-04-11 21:50:00.00    2019-04-11 22:35:00.00     45
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...