Как получить среднее время из ряда столбцов DateTime в SQL Server 2008? - PullRequest
4 голосов
/ 05 марта 2012

Допустим, у меня есть таблица, которая содержит следующие идентификатор и дату (просто для простоты).Он содержит множество строк.

Как бы выглядел мой запрос на выборку, чтобы получить среднее время для этих строк?

Спасибо,

Ответы [ 3 ]

1 голос
/ 05 марта 2012

Отказ от ответственности: может быть намного лучший способ сделать это.

Примечания:

  • Вы не можете использовать функцию AVG() против DATETIME/TIME
  • Я передаю DATETIME на DECIMAL( 18, 6 ), что, по-видимому, дает достаточно (+ - несколько миллисекунд) точный результат.

# 1 - средняя дата

SELECT 
    CAST( AVG( CAST( TimeOfInterest AS DECIMAL( 18, 6 ) ) ) AS DATETIME ) 

FROM dbo.MyTable;

# 2 - Среднее время - Удалить часть даты, приведение, а затем Среднее

SELECT 
    CAST( AVG( CAST( TimeOfInterest - CAST( TimeOfInterest AS DATE ) AS DECIMAL( 18, 6 ) ) ) AS DATETIME )

FROM dbo.MyTable;

Второй пример вычитает часть даты DATETIME из себя, оставляя только часть времени, которая затем преобразуется в десятичную для усреднения, и обратно в DATETIME для форматирования. Вам нужно удалить часть даты (это бессмысленно), а часть времени должна представлять среднее время в наборе.

0 голосов
/ 05 марта 2012

Я знаю, что, по крайней мере, в некоторых стандартах SQL выражение значения (аргумент функции AVG ()) не может быть значением даты или времени или строковым значением. Я не читал все стандарты SQL, но был бы удивлен, если бы это ограничение ослабло за эти годы.

Частично, это потому, что «среднее» (или среднее арифметическое) значений «n» определяется как сумма значений, деленная на «n». И выражение «01-Jan-2012 08:00» + «03-Mar-2012 07:53» не имеет никакого смысла. '01-Январь-2012 08:00 '/ 3.

Продукты Microsoft давно и быстро работают с SQL, предоставляя внутреннее представление типов данных даты и времени. Деннис Ритчи назвал бы это «необоснованной болтовней с реализацией».

В более ранних версиях Microsoft Access (и, возможно, также в текущих версиях) вы могли бы умножить дату «01 января 2012 года» на дату «03 марта 2012 года» и получить фактическое возвращаемое значение, предположительно в единицы квадратных дат.

Если ваша база данных поддерживает тип данных «интервал», то усреднение является простым и делает то, что вы ожидаете. (SQL Server не поддерживает интервальные типы данных.)

create table test (
  n interval hour to minute
);

insert into test values
('1:00'),
('1:30'),
('2:00');

select avg(n) 
from test;

avg (interval)
--
01:30:00
0 голосов
/ 05 марта 2012
SELECT CAST(AVG(CAST(ReadingDate AS real) - FLOOR(CAST(ReadingDate as real))) AS datetime)
FROM Rbh
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...