为了账号安全,请及时绑定邮箱和手机立即绑定

您应该选择SQLServer中的货币或十进制(x,y)数据类型吗?

您应该选择SQLServer中的货币或十进制(x,y)数据类型吗?

PIPIONE 2019-06-21 13:55:30
您应该选择SQLServer中的货币或十进制(x,y)数据类型吗?我很想知道money数据类型和类似decimal(19,4)(我相信,这就是货币内部的用途)。我知道money是特定于SQLServer的。我想知道是否有令人信服的理由来选择一个而不是另一个;大多数SQLServer示例(例如AdventureWorks数据库)使用money而不是decimal比如价格信息。我应该继续使用货币数据类型,还是使用十进制数据类型有好处?金钱是较少的字符输入,但这不是一个有效的原因:)
查看完整描述

3 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

你永远不应该用钱。它是不精确的,而且它是纯粹的垃圾;总是使用十进制/数字。

来看看我的意思:

DECLARE
    @mon1 MONEY,
    @mon2 MONEY,
    @mon3 MONEY,
    @mon4 MONEY,
    @num1 DECIMAL(19,4),
    @num2 DECIMAL(19,4),
    @num3 DECIMAL(19,4),
    @num4 DECIMAL(19,4)

    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

产出:2949.0000 2949.8525

有些人说你不分钱:

这是我用来计算相关性的问题之一,把它换成金钱会产生错误的结果。

select t1.index_id,t2.index_id,(avg(t1.monret*t2.monret)
    -(avg(t1.monret) * avg(t2.monret)))
            /((sqrt(avg(square(t1.monret)) - square(avg(t1.monret))))
            *(sqrt(avg(square(t2.monret)) - square(avg(t2.monret))))),current_timestamp,@MaxDate            
            from Table1 t1  join Table1 t2  on t1.Date = traDate            group by t1.index_id,t2.index_id


查看完整回答
反对 回复 2019-06-21
?
GCT1015

TA贡献1827条经验 获得超4个赞

SQLMenace说钱是不准确的。但你不能把钱乘以/除以金钱!3美元乘以50美分是多少?150美元?你用标量乘以/除以金钱,这应该是十进制。

DECLARE@mon1 MONEY,@mon4 MONEY,@num1 DECIMAL(19,4),@num2 DECIMAL(19,4),@num3 DECIMAL(19,4),@num4 DECIMAL(19,4)SELECT@mon1 = 100,
@num1 = 100, @num2 = 339, @num3 = 10000SET @mon4 = @mon1/@num2*@num3SET @num4 = @num1/@num2*@num3SELECT @mon4 AS moneyresult,
@num4 AS numericresult

正确结果:

moneyresult           numericresult
--------------------- ---------------------------------------
2949.8525             2949.8525

money只要您不需要超过4个小数位,并且确保您的标量(不代表货币)是decimalS.


查看完整回答
反对 回复 2019-06-21
  • 3 回答
  • 0 关注
  • 792 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信