在阅读了大部分文章之后,我的理解是,如果我们对MONEY有多个数字字段,它应该返回Money。
如果我的字段是INT,这可以正常工作。
ISNULL(POFTotal.Total * [Price],0) AS [Total Purchases PO ($)]
以上POF.Total是INT而Price是金钱。它在我的.Net应用程序中将结果返回为货币(十进制)。 但是对于下面的地方,NFFTotal.Total是浮点数,它会在我的.Net应用程序中将结果返回为float或double。
ISNULL(NFFTotal.Total * [Price],0) AS [Total NY COGS ($)]
我可以将它转换为下面的代码,但是想要理解为什么INT和FLOAT之间的区别在这里。
CONVERT(money,ISNULL(NFFTotal.Total * [Price],0)) AS [Total NY COGS ($)]
答案 0 :(得分:1)
在很多语言 1 中,您实际上不允许混合您提供给运营商的数据类型。这些语言会发生什么,它们将定义数据类型优先规则,并使用这些规则来确定执行计算的“最佳”类型。然后,它会将较低优先级的类型转换为较高优先级类型,然后执行计算。
因此,如果我们查看precedence rules for SQL Server,我们会看到float
的优先级高于money
,而int
的优先级高于int
}。这就是为什么当你在表达式中混合使用money
和money
时,会得到float
类型的结果,以及当你将money
和float
混合在一起时的原因表达式,你得到{{1}}。
在阅读了大部分文章之后,我的理解是,如果我们对MONEY有多个数字字段,它应该返回Money。
好吧,我不知道你读了哪些文章,但我认为它们充其量是不可靠的。
1 这个答案首先是说“大多数语言”,但后来我意识到这是一个过时的评论。在现代语言中,特别是那些允许自定义运算符和运算符重载的语言,情况不一定如此。但没有人会指责T-SQL是一种现代语言。
答案 1 :(得分:0)
MONEY和INT是定点数据类型,而FLOAT是浮点数据类型。
money -922,337,203,685,477.5808 to 922,337,203,685,477.5807 8 bytes
smallmoney -214,748.3648 to 214,748.3647 4 bytes
所以,如果你使用
NFFTotal.Total * [Price]
结果是float类型,你需要CONVERT才能使它与MONEY一起工作。