【问题标题】:Converting varchar pence to decimal pounds and pence将 varchar 便士转换为十进制英镑和便士
【发布时间】:2014-10-16 00:41:17
【问题描述】:

我有一个字段 varchar(100),其中包含 pence 作为数字,所有 35 个字符长,并且可能带有前导 -ve。根据下面的第二个和第三个字段,我需要以英镑和便士的形式返回。

我得到了不同的结果

SELECT
   [Tax1_156_PaymentNotSubj]
  ,CAST(LEFT([Tax1_156_PaymentNotSubj],33) + '.' + RIGHT([Tax1_156_PaymentNotSubj],2) AS decimal(35,2)) AS NegCastDecs
  ,CONVERT(decimal(35,2), LEFT([Tax1_156_PaymentNotSubj],33) + '.' + RIGHT([Tax1_156_PaymentNotSubj],2)) AS NegConvDecs
  ,CAST((CAST([Tax1_156_PaymentNotSubj] AS integer)) / 10 AS decimal(35,2)) AS NegCastIntDecs

我在最后的双重演员领域缺少什么,最好使用哪种方法?

【问题讨论】:

  • wtf!!那应该是 Tax1_156_PaymentNotSubj 吗!!
  • cast('-000000000576235' as money) / 100 ?
  • 英国税务局为您服务 ;) 他们希望为所有可能发生的情况做好准备!
  • 我不想显示货币符号或千位分隔符,只显示金额;此外,不推荐使用金钱,因为它不精确。
  • 我通常不使用 money 数据类型,因为它有一些限制,并且更喜欢使用数字来代替。话虽这么说,money 数据类型既不被弃用也不不精确。它活得很好,而且一如既往地是一个精确的数字。 msdn.microsoft.com/en-us/library/ms179882.aspx

标签: sql sql-server sql-server-2008 casting


【解决方案1】:

转换为 int 将删除小数位。这本身不是问题,因为您没有在投射之前划分数字。但是,如果所涉及的两个数字都是整数类型,SQL Server 将保持算术整数为基础。这可以在一个简单的 select 语句中看到:

select 7/2

3 的整数结果是最接近的基于整数的结果。在您的情况下,您的第三行双重演员需要进行两项更正:

,CAST((CAST([Tax1_156_PaymentNotSubj] AS integer)) / 100.0 AS decimal(35,2)) AS NegCastIntDecs

注意 / 10 增加到 100 以获得正确的小数位置,但数字常量也有小数点。这种不断变化告诉 SQL 引擎将数字本身视为十进制值,并返回十进制结果。例如,在以下语句中可以看到同样的情况:

select 7.0/2
select 7/2.0
select 7.0/2.0

所有这些都返回相同的 3.5000... 结果。如果算术运算中的两个数值都是整数,则结果是整数。如果至少有一个是小数,那么将产生一个小数。

编辑:作为旁注,这使得第二次演员变得多余。

【讨论】:

  • 这很有趣!我没有意识到只需将“.0”添加到除数就会产生很大的不同。 (“/ 10”是我的错字。)
猜你喜欢
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 2018-04-07
相关资源
最近更新 更多