#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 имеет решающее значение, если ваши данные охватывают несколько лет 🙂
Конечно, если ошибка охватывает изменение месяца, вам нужно будет решить, что делать (относится ли вся ошибка к концу или началу месяца, или ее следует разделить?)