Как SQL Server знает, какую точность использовать для денег - PullRequest
4 голосов
/ 01 сентября 2011

Как SQL Server узнает, как получить эти значения таким образом?

Key         someMoney
----------- ---------------------
1           5.00
2           5.002
3           5.0001

В общем, мне интересно, как узнать, сколько существует десятичных знаков без значительной потери производительности.

хочу получить

Key         someMoney             places
----------- --------------------- ----------
1           5.00                  2
2           5.002                 3
3           5.0001                4

Ответы [ 4 ]

5 голосов
/ 01 сентября 2011
1 голос
/ 02 сентября 2011

Это дает правильные результаты, но я не уверен, что он работает достаточно хорошо для вас, и я не пробовал его с данными, отличными от приведенных вами примеров:

;
with money_cte ([Key], [someMoney])
as
(
    select 1, cast(5.00 as money)
    union
    select 2, cast(5.002 as money)
    union
    select 3, cast(5.0001 as money)
)

select [Key], [someMoney], abs(floor(log10([someMoney] - round([someMoney], 0, 1)))) as places
from money_cte 
where [someMoney] - round([someMoney], 0, 1) <> 0

union

select [Key], [someMoney], 2 as places
from money_cte 
where [someMoney] - round([someMoney], 0, 1) = 0
0 голосов
/ 02 сентября 2011

Клиент форматирует это.SQL Server SSMS или что-то еще.SQL Server возвращает полное денежное значение в потоке данных и занимает целых 8 байтов.(http://msdn.microsoft.com/en-us/library/cc448435.aspx). Если SQL Server конвертируется в varchar, по умолчанию используется 2 десятичных знака

Обратите внимание, что браузер данных переполнения стека даже не показывает те же результаты, что и у вас:

http://data.stackexchange.com/stackoverflow/q/111288/

;
with money_cte ([Key], [someMoney])
as
(
    select 1, cast(5.00 as money)
    union
    select 2, cast(5.002 as money)
    union
    select 3, cast(5.0001 as money)
)

select *
    , CONVERT(varchar, someMoney) AS varchar_version
    , CONVERT(varchar, someMoney, 2) AS varchar_version2
FROM money_cte​
0 голосов
/ 02 сентября 2011

Так что это огромный уродливый хак, но он даст вам ценность, которую вы ищете ...

DECLARE @TestValue MONEY
SET @TestValue = 1.001

DECLARE @TestString VARCHAR(50)
SET @TestString = REPLACE(RTRIM(REPLACE(CONVERT(VARCHAR, CONVERT(DECIMAL(10,4), @TestValue)), '0', ' ')), ' ', '0')

SELECT LEN(@TestString) - CHARINDEX('.', @TestString) AS Places
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...