【问题标题】:Conversion failed when converting the nvarchar value '3.5' to data type int with Convert()使用 Convert() 将 nvarchar 值“3.5”转换为数据类型 int 时转换失败
【发布时间】:2019-03-02 15:05:09
【问题描述】:

ReduceDuties.Confirmed_Time 列是:(Nvarchar 类型)

  Confirmed_Time
|----------------|
|       5        | 
|       3.5      |
|       10       |
|       15       |
|       18       |

我想对数字进行分类。

所需的输出:

1-9   =>  2
9-19  =>  3

我试过了:

    select t.range as [score range], count(*) as [number of occurences]
from (
      select convert (float , Confirmed_Time) as Taeid,
         case when Confirmed_Time >= 1 and Confirmed_Time <= 9 then '0-9'
         when Confirmed_Time > 9 and Confirmed_Time <= 19 then '9-19'
         end as range
     from ReduceDuties) t
group by t.range

但我收到以下错误:

将 nvarchar 值“3.5”转换为数据时转换失败 输入整数。

【问题讨论】:

  • 因为3.5 不是整数值?
  • @solmaz ahamdi 尝试在case when 语句中应用floor(),例如case when floor(Confirmed_Time &gt;= 1...
  • 你为什么首先将数字数据存储为nvarchar
  • 解决此问题的一种方法是在 CASE 表达式中指定十进制文字,例如 Confirmed_Time &gt;= 1.0 and Confirmed_Time &lt;= 9.0
  • 区域格式与将数字数据存储为 nvarchar @SNR 有什么关系?除了应该在表示层处理格式之外,我不知道2 &gt; 10 的任何区域。对于 OP 的数据,“最高”值为'5'(最低为'10');我怀疑这是故意的。

标签: sql sql-server tsql


【解决方案1】:

显然,confirmed_time 是一个字符串。当您与整数比较时,它会尝试作为整数进行比较。所以,进行转换显式

(case when try_convert(float, Confirmed_Time) >= 1 and
           try_convert(float, Confirmed_Time) <= 9
      then '0-9'
 . . .

我的建议是永远不要依赖隐式转换。它引入了很难发现的错误。

如果您希望此值作为小数(这对我来说比 int 更有意义),那么您应该更改表中的类型。如果由于某种原因无法做到这一点(比如某些值不是数字),您可以添加一个新列:

alter table ReduceDuties add confirmed_time_dec as (try_convert(decimal(10, 2), Confirmed_Time));

然后您可以在查询中安全地使用confirmed_time_dec

【讨论】:

    【解决方案2】:

    问题是您没有在 CASE 表达式中进行从文本到数字的转换。我可能会从先进行转换的 CTE 开始:

    WITH cte AS (
        SELECT CONVERT(float, Confirmed_Time) AS Confirmed_Time
        FROM ReduceDuties
    )
    
    SELECT
        Confirmed_Time,
        CASE WHEN Confirmed_Time BETWEEN 1 AND 9  THEN '0-9'
             WHEN Confirmed_Time BETWEEN 9 AND 19 THEN '9-19'
        END AS range
    FROM cte;
    

    如果您真的打算主要将确认时间列用作数字,那么您应该将其设置为数字类型列。然后,如果您仍然不得不偶尔将其用作文本,只需根据需要进行转换即可。

    【讨论】:

      猜你喜欢
      • 2020-04-17
      • 2011-08-29
      • 2015-06-20
      • 2016-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多