【问题标题】:Attempting to determine decimals places using CHARINDEX, getting: Error converting data type varchar to float尝试使用 CHARINDEX 确定小数位,得到:将数据类型 varchar 转换为浮点数时出错
【发布时间】:2018-12-15 06:33:04
【问题描述】:

在尝试确定“.”之后的小数位数时,我一直在许多对象上使用这段代码。我将数据移动到的目标系统只能处理 2 d.p。所以我们找到了>2 d.p的数据。我乘以 10、100、1000,并将“每单价”字段值乘以相同的因子。

SELECT 
    HQPROD, [HQPR1],
    Decimals = CASE Charindex('.', [HQPR1])
                  WHEN 0 THEN 0
                  ELSE LEN(CAST(CAST(REVERSE(CONVERT(VARCHAR(50), [HQPR1], 128)) AS FLOAT) AS BIGINT))
               END 
FROM 
    [SM_REP].[dbo].[BPCSF64_HQT]) EDP ON P.HQPROD = EDP.HQPROD

我正在使用的列数据类型是DECIMAL(15,5)

样本数据:

HQPROD         HQPR1
--------------------------
47001-RM64     175.89900
47001-T06OX      5.84500
47002-20T       80.44700
47002-T24       98.10300
47002-T32      144.07000
47003-01         1.54000
47003-02         1.54000
47003-03         0.51000

错误信息:

将数据类型 varchar 转换为 float 时出错。

【问题讨论】:

  • 有负值吗? reverse() 会将 - 符号放在字符串的末尾,然后不能将其转换为浮点数。
  • 为什么不将所有内容乘以 1000 而忘记这些技巧?
  • 如果我只是乘以1000,有些目标字段会太大。表中有1个值为负值。

标签: sql sql-server decimal ssms


【解决方案1】:
SELECT 
HQPR1, 
Decimals = 

CASE WHEN HQPR1 > 0 THEN
       CASE Charindex('.', [HQPR1])
              WHEN 0 THEN 0
              ELSE LEN(CAST(CAST(REVERSE(CONVERT(VARCHAR(50), [HQPR1], 128)) AS FLOAT) AS BIGINT))
        END 
 ELSE 
     CASE Charindex('.', [HQPR1])
              WHEN 0 THEN 0
              ELSE LEN(CAST(CAST(REVERSE(     Stuff((CONVERT(VARCHAR(50), [HQPR1], 128)),1,1,'' )) AS FLOAT) AS BIGINT))
      END 
 END

这也适用于负数,正如粘性位所说,这可能会导致您的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    相关资源
    最近更新 更多