【问题标题】:SQL Converting nvarchar with leading zeros to decimalSQL将带有前导零的nvarchar转换为十进制
【发布时间】:2014-11-11 02:20:15
【问题描述】:

我有 6 个字符长的数字,隐含 3 个小数位。一个示例数字是 035000。所以这是数字 35 [已编辑]。如何将其从 nvarchar 转换为 decimal(6,3)

当我尝试CAST(col as decimal(6,3) 时,我得到了错误:

将 nvarchar 转换为数字数据类型时出现算术溢出错误。

我也尝试使用解析前导 0

select CAST(SUBSTRING(col, patindex('%[^0]%', col), 6) as decimal(6, 3))
from my_table 

然而,我得到了同样的错误信息。还是我应该将其作为nvarchar 留在数据库中,然后在我的 C# 代码中进行转换?

【问题讨论】:

  • 035000 如果我们尝试用 3 位小数替换,我认为它将是 35。您确定示例吗?
  • 您是否尝试将其转换为整数然后除以 1000?

标签: c# sql sql-server-2008 tsql


【解决方案1】:

您无法将 '035000' 转换为 NUMERIC(6,3),因为它的数字太多:该数字 35000.000 的数字表示,即 8 位。

由于您知道您的数字在您的数据库中始终是 6 位数字,因此您应该首先转换为 NUMERIC(6,0)(或任何其他可以保存它的数字类型 - 例如,INTEGER 可以使用)然后除以将小数点移动到位的正确因素。 (您说有 3 个隐含的小数位,但您的示例显示 4 - 只需使用您需要的任何转换因子):

SELECT CONVERT(NUMERIC(6, 3), CONVERT(NUMERIC(6, 0), col) / 1000.0) FROM my_table

【讨论】:

  • 只是建议使用这个 WHERE col 不是 null 和 ISNUMERIC(col) = 1 子句,这样在字符或 null 值的情况下它不会失败。
  • 谢谢,听起来应该可以。我明天测试并更新为答案。
猜你喜欢
  • 2013-04-01
  • 1970-01-01
  • 2015-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-18
相关资源
最近更新 更多