【发布时间】:2015-12-08 00:16:54
【问题描述】:
从实际使用的角度来看,货币和数字数据类型有什么区别。如果一个表有钱作为数据类型之一(字段名称说 BreakupAmount)和另一个数字类型(字段名称可能相同也可能不同),那么是否可以将这两个字段中的条目发布到第三个表中,其中数据类型是数字(字段名称可能是也可能不是 BreakupAmount)?有什么建议吗?
【问题讨论】:
标签: sql sql-server sql-server-2008
从实际使用的角度来看,货币和数字数据类型有什么区别。如果一个表有钱作为数据类型之一(字段名称说 BreakupAmount)和另一个数字类型(字段名称可能相同也可能不同),那么是否可以将这两个字段中的条目发布到第三个表中,其中数据类型是数字(字段名称可能是也可能不是 BreakupAmount)?有什么建议吗?
【问题讨论】:
标签: sql sql-server sql-server-2008
与 Decimal 相比,金钱没有任何优势。如果最多 5 位小数的小数单位在您的货币或数据库架构中无效,则只需使用具有适当精度和小数位数的 Decimal。
DECLARE
@mon1 MONEY,
@mon2 MONEY,
@mon3 MONEY,
@mon4 MONEY,
@num1 Numeric(19,6),
@num2 Numeric(19,6),
@num3 Numeric(19,6),
@num4 Numeric(19,6)
SELECT
@mon1 = 100, @mon2 = 339, @mon3 = 10000,
@num1 = 100, @num2 = 339, @num3 = 10000
SET @mon4 = @mon1/@mon2*@mon3
SET @num4 = @num1/@num2*@num3
SELECT @mon4 AS moneyresult, @num4 AS numericresult
【讨论】:
您选择的数据类型将取决于相关信息所需的精度。 尽管,顾名思义,Money 数据类型的设计原因显而易见,但它仅限于小数点后四位,这就是为什么数字数据类型经常受到青睐的原因。
【讨论】:
永远不要使用金钱; 1)它是专有的,所以移植它很痛苦。它是几十年前的众多“Sybase 代码博物馆”功能之一。还记得 UNIX 的早期版本吗?
2) 当你不需要让说方言的人听起来像乡巴佬时,用方言编写代码。你最好使用 DECIMAL(s,p),这样你就可以使用适当大小的列。
3) 它确实在后端显示和格式化,带有逗号和美元符号。这违背了分层架构的目的。
4) MONEY 数据类型存在舍入错误。
对货币使用不止一种运算(乘法或除法) 列将产生严重的舍入错误。一种简单的可视化方法 金钱算术是在每个之后放置一个 ROUND() 函数调用 手术。例如,
金额 = (部分/总金额) * 总金额 可以使用货币算术重写为: 金额 = ROUND(ROUND(部分/total_amt, 4) * Gross_amt, 4)
四舍五入到小数点后四位似乎不是问题,直到 您使用的数字大于 10,000。
【讨论】: