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