将varchar值'July'转换为数据类型int时出错“消息245,级别16,状态1,行22转换失败。”

时间:2017-01-17 12:19:08

标签: sql-server

SELECT  
    CAST((DATEDIFF(day, '21 JULY 2017', CAST(DAY(DATEADD(mm, DATEDIFF(mm, -1, '21 JULY 2017'), 0) -1) +
        LEFT(CONVERT(VARCHAR, DATENAME(MM,'21 JULY 2017'), 120), 10) + 
        CAST(YEAR('21 JULY 2017') AS VARCHAR(4)) AS DATETIME))) AS INT ) * (2.08 / DAY(EOMONTH('21 JULY 2017')))

我想计算一天的计算结果。

但是我收到了一个错误:

  

将varchar值'July'转换为数据类型int时,转换失败。

1 个答案:

答案 0 :(得分:1)

在不知道预期输出是什么,或者你试图计算什么的情况下,我发现你得到的错误的原因是你尝试使用{{1}将int值与字符串值连接起来。 }签 在这些情况下,SQL Server会尝试将字符串值隐式转换为int值以执行添加操作(而不是您想要的串联操作)。 因此,我已经为varchar和空格添加了转换,以便将转换为datetime。

+

我得到的输出是Select cast((Datediff(day,'21 JULY 2017', CAST(cast(day(dateadd(mm,DateDiff(mm, -1, '21 JULY 2017'),0) -1) as varchar(10)) +' '+ LEFT(CONVERT(VARCHAR(10), DATENAME(MM,'21 JULY 2017') , 120), 10) +' '+ cast(year('21 JULY 2017') as varchar(4)) as datetime))) as int) * (2.08/DAY(EOMONTH('21 JULY 2017'))) ,但由于我不知道你的目标是什么,我不知道它是否正确。

由于我有空闲时间,我能够重新编写您的查询并使用更简单的查询获得完全相同的结果:

0.6709677419350