То же SQL, другой результат в Sybase и SQL Server - PullRequest
0 голосов
/ 22 февраля 2020

Следующий запрос возвращает разные значения в Sybase и SQL Server.

select CONVERT(numeric(12, 6), round((-0.00193499999999991) / (30) * (9) + 9.742500000000000e-001, 6))

В Sybase он возвращает 0,973670, в то время как в SQL Server он возвращает 0,973669. Знаете ли вы, почему и какой результат является правильным?

Изменение точности округления с 6 на 7 приводит к тому, что Sybase также возвращает 0,973669, но я не уверен, почему это необходимо. SQL Сервер также возвращает 0,973669 с круглой точностью 7

select CONVERT(numeric(12, 6), round((-0.00193499999999991) / (30) * (9) + 9.742500000000000e-001, 7)) 

Спасибо

Решено : ответ Гордана ниже указал мне правильное направление. Я забыл упомянуть одну деталь. Литералы в запросе на самом деле были значениями, считанными как переменные в Stored Pro c, который затем использовался в опубликованном мной запросе. Источником литеральных значений была разница между двумя полями базы данных, объявленными цифрами c (10,6). У устаревшего SP есть две переменные, объявленные как float, а разница 0,972315 и 0,974250 выдает -0,001935, однако на SQL Server он выдает -0,00193499999999991, что неудивительно, поскольку его математика с плавающей запятой. Таким образом, Sybase маскировал проблему. Изменение переменной SP на тип Numberri c (12,6) решило проблему и результаты в Sybase и SQL Соответствие сервера. Я рассмотрю другой код SP для использования переменных типа float.

1 Ответ

1 голос
/ 22 февраля 2020

На основании моего прочтения соответствующей документации ( Sybase и SQL Сервер ) две базы данных по-разному обрабатывают числовые литералы.

  • Sybase интерпретирует -0.00193499999999991 как число с плавающей запятой.
  • SQL Сервер интерпретирует его как десятичное число.

Это, вероятно, объясняет разницу в результатах.

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

...