使用Convert()将nvarchar值'3.5'转换为数据类型int时转换失败

问题描述 投票:1回答:2

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”转换为数据类型int时转换失败。

sql sql-server tsql
2个回答
3
投票

显然,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


3
投票

问题是你没有在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;

如果你真的打算主要使用确认的时间列作为数字,那么你应该只是使它成为一个数字类型列。然后,如果您不得不偶尔将其用作文本,只需根据需要进行转换。

© www.soinside.com 2019 - 2024. All rights reserved.