Как я могу сохранить цифры после запятой в типе данных деньги? - PullRequest
0 голосов
/ 23 августа 2011

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

например:

Я пытаюсь использовать тип данных money для хранения телефонных номеров(кажется, самый оптимальный размер хранилища) РЕДАКТИРОВАТЬ: для меня важен размер хранилища (8 байтов для денежного типа данных вместо 16+ байтов для поля varchar)

Если я храню 10 цифр справасторона десятичного разряда и 3-4 цифры справа от десятичного разряда в качестве расширения, когда я пытаюсь «разобрать» расширение, я, кажется, теряю что-то больше, чем 2 цифры

, поэтому номер телефонавот так: (305) 444-1234 доб 283 будет храниться в виде денег типа вот так: 3054441234.283

у меня проблема, если я использую CAST (myMoneyValue как varchar (x)), то 3054441234.283 превращается в3054441234.28

Может кто-нибудь помочь?

РЕДАКТИРОВАТЬ2: давайте на минуту представим, что я не упомянул о сохранении там номера телефона ... допустим, была причина, по которой мне нужно было объединить тип данных денег вместе с полем varchar ... например, еслиЯ хотел объединить '$' + 0.1125 + '/ sqft.'- есть ли способ сохранить часть .0025 денежного поля?

Ответы [ 7 ]

8 голосов
/ 23 августа 2011

Телефонные номера хранятся в полях varchar, возможно, разложены на коды стран / регионов, добавочный номер и т. Д.

Если вы настаиваете, то либо:

А как насчет лидирующих нулей, используемых во многих странах?

6 голосов
/ 23 августа 2011

Прекратите использовать тип данных money для хранения телефонных номеров. Если вы хотите это как varchar, то храните это как varchar. Не имеет смысла хранить это как что-то еще, чтобы потом преобразовать его.

Это также может сбить с толку других, которые позже будут просматривать ваши данные (скажем, после того, как вас сбил автобус, и вы не оставите никаких документов). Кроме того, приведение может вызвать проблемы с использованием индекса и может реально замедлить ваши запросы.

4 голосов
/ 23 августа 2011

CAST(myMoneyValue as varchar(x)) предполагает два десятичных знака по умолчанию (перевод денег в varchar). Вы можете принудительно ввести любое количество десятичных разрядов.

НО ВЫ НЕ МОЖЕТЕ ЗНАТЬ , если это расширение на 3 или 4 цифры заранее (1234567.123 - это 123-4567 x 123 или 123-4567 x 1230 - они оба одинаковы во внутренних представлениях money / decimal - если только вы не потрудитесь всегда заполнять их слева после десятичной дроби - 1234567.0123 равен 123-4567 x 123 - так что теперь деньги даже не настолько удобочитаемы для человека в их «родной форме» ).

Я думаю, это в значительной степени показывает, почему вы не должны использовать десятичные числа или деньги для этих данных.

3 голосов
/ 23 августа 2011

Вы действительно изо всех сил пытаетесь усложнить задачу - просто сохраните номер телефона как char или varchar соответствующей длины.

Относительно EDIT2:

Значение style для money или smallmoney для преобразования в символьные данные:

  • 0 (по умолчанию) - без запятых каждые три цифры слева от десятичной точки и две цифры справа от десятичной точки;например, 4235.98
  • 1 - запятые каждые три цифры слева от десятичной точки и две цифры справа от десятичной точки;например, 3 510,92
  • 2 - без запятых каждые три цифры слева от десятичной точки и четыре цифры справа от десятичной точки;например, 4235,9819

Вам необходимо использовать последний:

CONVERT(varchar(x), myMoneyValue, 2)
2 голосов
/ 23 августа 2011

попробуйте использовать НОМЕР (14,4). Деньги не являются хорошим типом данных для этого, именно по тем причинам, которые вы видите.

2 голосов
/ 23 августа 2011

Ваша самая большая проблема в том, что вы пытаетесь сохранить номер телефона в типе данных money.Не делайте этого, и тогда у вас не возникнет этой проблемы.

Телефонный номер не является «номером» в традиционном смысле.Например, начальные нули значимы.

1 голос
/ 23 августа 2011

Пример выполнения

-- http://msdn.microsoft.com/en-us/library/ms187928.aspx

DECLARE @money AS MONEY = 12345.6789

SELECT CONVERT(varchar, @money), CONVERT(varchar, @money, 2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...