【问题标题】:How to convert nvarchar to decimal in SQL如何在 SQL 中将 nvarchar 转换为十进制
【发布时间】:2017-03-01 09:28:34
【问题描述】:

如何在 SQL Server 中将 nvarchar 转换为十进制?

我需要将'38,716.1311' 之类的值转换为 38716.1311。

我尝试过使用这种方法但无法成功转换:

DECLARE @TempValue NVARCHAR(100) = '38,716.1311'

SELECT 
    CONVERT(DECIMAL(18, 2), @TempValue) 

谁能提出正确的查询?提前致谢

【问题讨论】:

  • 去掉逗号怎么样

标签: sql sql-server-2008


【解决方案1】:

只需在转换之前从字符串中删除逗号:

Select CONVERT(DECIMAL(18,2),replace('38,716.1311', ',', '')) 

【讨论】:

    【解决方案2】:

    使用 REPLACE 删除逗号,如下所示:

    Declare @TempValue nvarchar = '38,716.1311'
    Select CONVERT(DECIMAL(18,2), REPLACE(@TempValue, ',', ''))
    

    【讨论】:

      【解决方案3】:
      Declare @TempValue nvarchar(100)
          SET @TempValue = Replace('38,716.1311',',','')
      Select cast(@TempValue AS DECIMAL(18,2)) 
      

      --我们不能将像 "38,716.1311" (NVARCHAR) 这样的值转换为 DECIMAL 所以首先我们将 "," 替换为空白 "38716.1311" 然后转换为 DECIMAL

      【讨论】:

      • 虽然欢迎使用此代码 sn-p,并且可能会提供一些帮助,但它会是 greatly improved if it included an explanation of howwhy 这解决了问题。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人!请edit您的答案添加解释,并说明适用的限制和假设。
      【解决方案4】:

      如果@TempValueMONEY 会更好,所以它忽略逗号分隔

      Declare @TempValue MONEY =  '38,716.1311'
      Select CAST(@TempValue AS DECIMAL(18,2))
      

      【讨论】:

        【解决方案5】:

        使用MONEY数据类型并转换成十进制数据类型:

        DECLARE @Col MONEY = '38,716.1311'
        SELECT CONVERT(DECIMAL(20,4),@Col) 
        

        或替换逗号并转换为十进制

        DECLARE @Col VARCHAR(100)  = '38,716.1311'
        SELECT CONVERT(DECIMAL(20,4),REPLACE(@Col,',',''))
        

        【讨论】:

          【解决方案6】:

          以我为例,一些数据如下:version: '1.2.12'

          我想在Sql中注册类似版本:1.212

          1. 清理varchar(去掉点或逗号)

          2. 转换为 char(6 位)并用 0 填充空格。 (通过合并捕获 null)

          3. 转换为 numeric 并除以 100000

          4. 转换为十进制 (10,4)

          结果 ->> 1.212 版

          Select 'version'=cast(cast(replace(cast(replace(coalesce([##DATA##],'0'), '.', '') as char(6)),' ','0')as numeric(6))/100000 as decimal (10,4)
          

          也许还有其他更简单的解决方案。

          【讨论】:

            【解决方案7】:

            您的 nvarchar 值是特定于文化的。 (具有特定于文化的小数和千位分隔符) 因此,您可以在传入正确的文化时使用PARSE 方法。

            DECLARE @TempValue NVARCHAR(100) = '38,716.1311'
            
            SELECT PARSE(@TempValue AS DECIMAL(18, 4) USING 'en-US') 
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-02-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多