SQL Сервер - вопрос округления - PullRequest
0 голосов
/ 25 февраля 2020

Ниже приведена часть кода, которую я использую в SQL Серверной хранимой процедуре.

DECLARE @MinimumTime FLOAT,
        @filter VARCHAR(MAX)

SET @MinimumTime = 43885.664166666664241

SELECT @filter =  COALESCE('[Time.Minimum] >= ' + CAST(@MinimumTime AS varchar(MAX)), '')
PRINT @filter

Это приводит к следующему выводу:

[Time.Minimum] >= 43885.7

, что не ожидается один и влияет на выход процедуры. Я не хочу, чтобы это числовое значение было округлено. Я хочу полное значение с плавающей точкой, которое я передал Примерно так:

[Time.Minimum] >= 43885.664166666664241

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

Ответы [ 3 ]

3 голосов
/ 25 февраля 2020

Используйте параметры! Это единственный способ получить «точное» значение с плавающей запятой:

Declare @ sql nvarchar (max);

set @sql = N'
select *
from t
where '[Time.Minimum] >= @MinimumTime
';

exec sp_executesql @sql,
                   N'@MinimumTime float',
                   @MinimumTime=@MinimumTime;

Другими словами, не конвертировать в строку .

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

Вы также можете использовать

CONVERT

SELECT @filter =  COALESCE('[Time.Minimum] >= ' + CONVERT(NVARCHAR(30), @MinimumTime,2), '')

Но это даст вам вывод в научном c формате.

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

Пожалуйста, попробуйте выполнить приведенный ниже запрос от числа с плавающей точкой до числа c SQL -FIDDLE :

DECLARE @MinimumTime numeric(32,15),
@filter VARCHAR(MAX)
SET @MinimumTime = 43885.664166666664241

SELECT @filter =  COALESCE('[Time.Minimum] >= ' + cast(@MinimumTime as varchar(MAX)), '')
select @filter

Примечание :

The basic difference between Decimal/Numeric and Float :
Float is Approximate-number data type, which means that not all values in the data type range can be represented exactly.
Decimal/Numeric is Fixed-Precision data type, which means that all the values in the data type reane can be represented exactly with precision and scale.
...