代码之家  ›  专栏  ›  技术社区  ›  Allan F

是否舍入MS SQL*Server 2012中varchar列中的值?

  •  0
  • Allan F  · 技术社区  · 7 年前

    我有一个奇怪的要求在 varchar SQL Server 2012中的列。我知道在 瓦卡尔 .

    即该列是 瓦卡尔 但包含一个表示数字的字符串。 我有834.7833000000005和831.06669999999997和797.45000000000005这样的字符串值,但我想将它们更新为834.7833和831.0667和797.45这样的字符串值(修剪尾随的零不是太重要,但需要)。

    这似乎很接近,有更好的选择吗?我应该用圆函数吗?

    CREATE TABLE [Clinical].[AAAJFJunk]
    (
        [Call Length] [NVARCHAR](50) NULL
    ) ON [PRIMARY]
    
    INSERT [Clinical].[AAAJFJunk] ([Call Length] ) 
    VALUES (N'834.78330000000005'), 
           (N'831.06669999999997'),
           (N'797.45000000000005')
    GO
    
    UPDATE Clinical.AAAJFJunk
    SET [Call Length] =
           CAST(CAST([Call Length] AS DECIMAL(11, 4)) AS VARCHAR);
    
    0 回复  |  直到 7 年前
        1
  •  0
  •   Allan F    7 年前

    检查建议值的示例选择:

    select 
          case when ISNULL([Call Length], '') = '' 
          then '' 
          else 
     FORMAT(Cast ( CONVERT(numeric(16,4), CAST([Call Length] AS FLOAT)) as float),'########0.####')   
          end as    val123
        from Clinical.AAAJFJunk
    

    更新语句..

    包括对空值的处理(即保持它们不变)

    包括在源字符串值中使用e符号处理科学值。例如6.669999999999995E-2

    包括删除数字右侧的尾随零

    使用format函数。

    带有浮点数的str函数留下尾随零,所以我没有使用它。

    带浮点数到字符串的convert函数决定了它自己的小数位数,所以我也想避免这样做!

    UPDATE Clinical.AAAJFJunk
    SET [Call Length] =
          case when ISNULL([Call Length], '') = '' 
          then '' else 
                FORMAT(Cast ( CONVERT(numeric(16,4), CAST([Call Length] AS FLOAT)) as float),'########0.####')   end
    

    请注意,格式说明符中的0具有特定含义。

    请参阅:

    https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings