MySql Запрос для расчета времени безотказной работы Сервиса - PullRequest
0 голосов
/ 06 августа 2020

У меня две таблицы. В одной таблице я веду время начала и окончания службы. Вторая таблица является международной и содержит время начала и окончания обслуживания (0 означает остановку, а 1 означает начало). Нужна помощь по запросу MySQL о доступности услуги в течение дня или для конкретного c диапазона дат в часах, как показано ниже:

Date      |ServiceId|Available|Not available
06-08-2020|189      | 10      |2
06-08-2020|187      | 8       |4

Мои таблицы, как показано ниже:

TblStatus

ServiceId|status|Updated_Date
189      |1     |04-08-2020 09:42
189      |0     |04-08-2020 12:29
189      |1     |04-08-2020 12:47
189      |0     |04-08-2020 13:37
189      |1     |04-08-2020 14:16

TblMaster

ServiceId|StartTime|EndTime
189      |09:00:00 |23:59:59

Ответы [ 2 ]

2 голосов
/ 06 августа 2020
SELECT Date(TS.Updated_Date) as Updated_Date, TM.ServiceId,
count(case when TS.Status=1 then 1 END) as Available, 
count(case when TS.Status=0 then 1 END) as NotAvailable
from TblMaster TM 
INNER JOIN TblStatus TS ON (TM.ServiceId = TS.ServiceId)
where TM.StartTime <= Time(TS.Updated_Date) and TM.EndTime >= Time(TS.Updated_Date)
group by Date(TS.Updated_Date),ServiceId;
0 голосов
/ 06 августа 2020
  1. Сортировка набора данных по сервису, updated_at как c
  2. Создайте переменные, в которых вы сохраните предыдущую обработанную строку

Возможно, вам потребуется отслеживать: last_row_service_id last_row_status last_row_updated_date

Набор данных процесса
    #pseudocode
    @SET last_row_service_id := -1;
    @SET last_row_status := -10; #set to -10 so that we wont have -1 or +1 value in first row
    @SET last_row_updated_date :='2020-08-06 00:00:00';
    
    select DATE(updated_date) as 'Date', serviceId as ServiceId,
    
    SUM(IF(@last_row_service_id = serviceId AND @last_row_status - status = 1, 
    
    #check if youre still on the same service and if last_row_status is 1 and current row status is 0
    
    TIME_TO_SEC(updated_date) - TIME_TO_SEC(@last_row_updated_date), 0)) as 'Available', 
    
    #Get elapsed time in seconds, else return 0 seconds
    
    # Do the same to 'Not available'
    
    SUM(IF(@last_row_service_id = serviceId AND @last_row_status - status = -1, 
    
    TIME_TO_SEC(updated_date) - TIME_TO_SEC(@last_row_updated_date), 0)) as 'Not available', 
    
    # change value of pointers
    
    @last_row_service_id := serviceId,
    @last_row_status := status,
    @last_row_updated_date := updated_date
    
    from TblStatus
    #Add your date filter
    group by DATE(updated_date),serviceId

Вам все еще нужно обрабатывать время безотказной работы службы, которое длится после 23: 59: 59

Что вы можете сделать, так это добавить START (статус 1) событие в каждом начале дня и событие STOP (статус 0) в каждый конец дня перед обработкой.

...