Лучший способ хранения десятичного числа с различным количеством десятичных знаков - PullRequest
0 голосов
/ 25 февраля 2020

Нам нужно хранить десятичные числа (цены за единицу) в таблице базы данных. Проблема в том, что нам нужно хранить и отображать одинаковое количество десятичных разрядов, которые конечный пользователь предоставил в качестве пользовательского ввода. Максимальное количество знаков после запятой равно 6. Так, например:

  • 1.00
  • 9.9999
  • 0.123456

Для начала с например, DECIMAL (10,6), кажется, всегда хранит максимальное количество знаков после запятой (6).

MONEY хранит различное количество знаков после запятой (2-4), но не более 4 (и имеет некоторые другие вопросы, почему мы не хотим его использовать).

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

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

Если мы добавим еще один столбец, можно ли отформатировать десятичное значение непосредственно в запросе, используя этот столбец?

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020

Два предложения, которые я могу придумать:

  1. Как вы уже упоминали, сохраните его в тексте

  2. Сохраните его в decimal(19,6)

    • Сохраните количество десятичных знаков в другом поле, например 3
    • Используйте вычисляемый столбец для визуализации формата, например FORMAT()

Хотя вам нужно перепроектировать число десятичных дробей.

Это сложнее, но, по крайней мере, вы можете сохранить число в числовом поле c и сделать SSMS визуализации, что вы хотите.

CREATE TABLE MyTable (
NumericValue DECIMAL(19,6) NOT NULL,
Decimals TINYINT NOT NULL,
Formatted AS (FORMAT(NumericValue,'#.' + LEFT('00000000',Decimals))) 
)

INSERT INTO MyTable (NumericValue, Decimals)
SELECT 10.2,3 UNION ALL
SELECT 1.2,1 UNION ALL
SELECT 1,3

SELECT * FROM MyTable
0 голосов
/ 25 февраля 2020

Мы можем использовать десятичное число при хранении. LAW:

десятичное (1,9). Байты хранилища - 5

десятичное число (10,19). Байты хранилища - 9

*. 1007 * десятичное число (20,28) Байт хранилища равно 13

десятичное число (29,38) Число байт хранилища равно 17

О деньгах: если у вас сложный бизнес, не используйте MONEY , Деньги не должны нас спасать.

Например: мы делаем скидку на весь счет. Если мы хотим разделить это значение для строк в будущем, вероятно, будет создано третье десятичное место. И если вы используете Mani, это значение должно быть усечено, что приведет к ошибке Trending.

Использование десятичных дробей позволяет уменьшить коэффициент ошибки.

вы можете узнать о десятичной дроби в DocMicrosoft

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...