2013-08-30 4 views
-1

У меня есть следующий запрос:Как получить среднее значение DATEDIFF()?

SELECT 
    DATEDIFF(day, DateUsed, DateExpires) AS DaysBetweenExpirationAndUse 
FROM tblOffer 

Как я мог получить среднее число дней с DaysBetweenExpirationAndUse колонок?

+0

Вы можете разместить свой код, где вы пытались использовать AVG? –

+9

Что значит «очевидно, не работает»? Я бы предположил, что это работает. Вы получаете неправильные результаты или сообщение об ошибке? Какие результаты вы получаете, и чем он отличается от того, что вы получаете? Каковы сообщения об ошибках? Одна вещь, которую я мог представить, интуитивно понятный, заключается в том, что SQL Server 'AVG' выполняет усреднение с целочисленной логикой для целочисленного ввода.Если это проблема, использование 'AVG (CAST (DATEDIFF (d, DateUsed, DateExpires) как FLOAT))' может дать более интуитивный результат. – FrankPl

+0

Очевидно, что это не сработало, потому что я попробовал это, и я не стал бы задавать вопрос, действительно ли это работает. Проблема заключалась в том, что я выбирал *, после 'DaysBetweenExpirationAndUse'. Как только я удалил это, он сработал. –

ответ

6

Это должно работать нормально:

SELECT AVG(DATEDIFF(d, DateUsed, DateExpires)) AS AvgDaysBetweenExpirationAndUse 
FROM tbl 

Если вы хотите десятичную пла цы в вашем AVG:

SELECT AVG(DATEDIFF(d, DateUsed, DateExpires)*1.0) AS AvgDaysBetweenExpirationAndUse 
FROM tbl 

Если вы хотите, чтобы выбрать AVG и другие поля тоже без группировки:

SELECT * 
     ,AVG(DATEDIFF(d, DateUsed, DateExpires)*1.0) OVER() AS AvgDaysBetweenExpirationAndUse 
FROM tbl 
3

Этот sql может выполнить?

SELECT AVG(t.a) from 
    (
    SELECT DATEDIFF(d, DateUsed, DateExpires) AS a 
    FROM tbl 
) as t 

это мой тест:

enter image description here

но хороший ответ:

SELECT AVG(DATEDIFF(d, DateOne, DateTwo)*1.0) AS avgDate 
    FROM Test 
+0

Он может выполняться, но может завершиться ошибкой. – Kermit

+0

Я бы попробовал. – very9527

+0

, пожалуйста, покажите мне свою таблицу записей – very9527

1
SELECT AVG(DATEDIFF(d, DateUsed, DateExpires)) FROM tbl 

должен работать нормально. Обратите внимание, что поскольку DATEDIFF возвращает целочисленное значение, результат также будет целочисленным.

Если вы хотите, среднее «точный» (насколько плавающей точкой становится), используйте

SELECT AVG(CAST(DATEDIFF(d, DateUsed, DateExpires) AS FLOAT)) FORM tbl 
1

DATEDIFF функция не имеет ничего общего с этой проблемой вычисления среднего (AVG) значений INT. Поведение SQL Server отличается от других серверов, но в соответствии с ANSI SQL стандарта

Если AVG указан и DT является точным числовым (личная нота: INT является точной числовой), то данные типа из результат является точной численной с реализацией - определенная точность не менее точности DT и шкала, определяемая реализацией, не меньше шкалы DT.

который (на мой взгляд) не поможет в этом случае. Большинство людей ожидают, что AVG(INT value) приведет к результату NUMERIC/DECIMAL/FLOAT/REAL, но результатом будет усеченное значение INT. Решение состоит в том, чтобы преобразовать значения [TINY | SMALL | BIT] INT в DECIMAL/NUMERIC с использованием CONVERT(DECIMAL(p,s)/NUMERIC(p,s), ...) или просто умножить на 1. или 1.0.

Пример:

SELECT ColINT, SQL_VARIANT_PROPERTY(ColINT,'BaseType') AS Col_DataType 
FROM 
(
    SELECT 10 AS ColINT UNION ALL SELECT 9 
) x; 
/* 
ColINT  Col_DataType 
----------- ------------ 
10   int 
9   int 
*/ 

SELECT AVG(ColINT) AS Avg#1, SQL_VARIANT_PROPERTY(AVG(ColINT),'BaseType') AS Avg#1_DataType 
FROM 
(
    SELECT 10 AS ColINT UNION ALL SELECT 9 
) x; 
/* 
Avg#1  Avg#1_DataType 
----------- -------------- 
9   int 
*/ 

SELECT AVG(ColINT) AS Avg#2, SQL_VARIANT_PROPERTY(AVG(ColINT),'BaseType') AS Avg#2_DataType 
FROM 
(
    SELECT 10 AS ColINT UNION ALL SELECT 9 
) x; 
/* 
Avg#2  Avg#2_DataType 
----------- -------------- 
9   int 
*/