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

Sql 使用Convert()将nvarchar值“3.5”转换为数据类型int时转换失败,sql,sql-server,tsql,Sql,Sql Server,Tsql,列缩减率。确认时间为:Nvarchar类型 我想把数字分类 所需输出: 我试过: 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

列缩减率。确认时间为:Nvarchar类型

我想把数字分类

所需输出:

我试过:

    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

显然,时间是一根弦。当您与整数进行比较时,它将尝试作为整数进行比较。因此,要明确转换:

然后,您可以在查询中安全地使用确认时间。显然,确认时间是一个字符串。当您与整数进行比较时,它将尝试作为整数进行比较。因此,要明确转换:


然后,您可以在查询中安全地使用confirated\u time\u dec。

问题在于您没有在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;

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

问题在于您没有在大小写表达式中进行从文本到数字的转换。我可以从首先进行转换的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;

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

因为3.5不是整数值?@solmaz ahamdi尝试在case when语句中应用floor,例如,当floorConfirmed_Time>=1时出现case…为什么首先要将数字数据存储为nvarchar?解决此问题的一种方法是在case表达式中指定十进制文字,如Confirmed_Time>=1.0和Confirmed_Time区域格式与将数字数据存储为nvarchar@SNR有什么关系?除了格式应该在表示层中处理外,我不知道有哪个区域2>10。OP数据的最高值为“5”,最低值为“10”;我怀疑这是故意的。因为3.5不是一个整数值?@solmaz ahamdi尝试在case when语句中应用floor,例如,case when floorConfirmed_Time>=1…为什么首先要将数字数据存储为nvarchar?解决这一问题的一种方法是在case表达式中指定十进制文字,像确认时间>=1.0和确认时间一样,区域格式与将数字数据存储为nvarchar@SNR有什么关系?除了格式应该在表示层中处理外,我不知道有哪个区域2>10。OP数据的最高值为“5”,最低值为“10”;我怀疑这是故意的。
(case when try_convert(float, Confirmed_Time) >= 1 and
           try_convert(float, Confirmed_Time) <= 9
      then '0-9'
 . . .
alter table ReduceDuties add confirmed_time_dec as (try_convert(decimal(10, 2), Confirmed_Time));
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;