sql — группировка по метке времени / месяцу

#sql

#sql

Вопрос:

Два столбца моей таблицы («Ошибки») представляют начало («01:10:2011 12:45:59») и конец (как формат начала) события сбоя. Мой запрос принимает среднюю продолжительность (конец-начало) каждого события.

Я хочу найти среднюю продолжительность группировки событий по месяцам, имея в виду, что временная метка отображается в форме, упомянутой выше. Итак, если события моей таблицы:

 A|SERVICE|        END        |      START
1|ADSL   |1/11/2011 10:00:00 |4/11/2011 10:00:00
2|ADSL   |6/11/2011 12:00:00 |6/11/2011 24:00:00
3|ADSL   |5/12/2011 10:00:00 |6/12/2011 10:00:00
4|ADSL   |7/12/2011 12:00:00 |8/12/2011 24:00:00
  

результатом группировки (в днях) будет для 11-го месяца средняя продолжительность строки 1,2 ([3days 0.5day]/2= 1.75d) , а для 12-го месяца средняя продолжительность 3,4, то есть 1,25 дня

 NOVEMBER|1.75
DECEMBER|1.25
  

Комментарии:

1. Какой SQL-DB вы используете?

2. Подождите, вы хотите сказать, что ваши «временные метки» — это не фактические timestamp типы, а форматированная строка? Если это так, потратьте время, которое потребуется вам для преобразования базы данных в использование фактического типа — преобразования «на лету» могут занять немало времени (помимо того факта, что вы не защищены от неверных данных …). И разные базы данных обрабатывают временные метки по-разному — DB2 сможет дать вам только приблизительную оценку, например (если вы не выполняете какую-то смехотворно сложную математику).

Ответ №1:

Используйте DATEPART, чтобы получить значение месяца для группировки:

 SELECT DATENAME(month, MIN(Start)) AS [Month], DATEPART(YEAR, Start) As [Year], CONVERT(FLOAT, AVG(DATEDIFF(hour, Start,[End]))) / 24 AS [Days]
    FROM Faults 
    GROUP BY DATEPART(Month, Start), DATEPART(Year, Start)
  

Включение года в GROUP BY имеет решающее значение, если ваши данные охватывают несколько лет 🙂

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