【问题标题】:Error "Msg 245, Level 16, State 1, Line 22 Conversion failed when converting the varchar value 'July' to data type int."将 varchar 值 'July' 转换为数据类型 int 时,错误“消息 245,级别 16,状态 1,第 22 行转换失败。”
【发布时间】:2017-06-01 12:09:15
【问题描述】:
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 时转换失败。

【问题讨论】:

  • '2017-07-21'代替'21 JULY 2017'
  • 你要计算什么?好像你的sql很复杂,我想如果你解释一下你的目标是什么,我们可能会更好地帮助你。
  • 展示你的尝试是可以的,但我怀疑当前的查询是否是实现目标的最佳方式。但很难知道,因为您没有告诉我们您想要达到的目标。理想情况下,edit 问题并添加一些样本数据和您的预期结果
  • 感谢您的回复..实际情况如下..如果他在 2017 年 7 月 21 日加入,1 个月(比如 7 月)员工可以获得 2.08 天的假期(整个日历月).. 所以他应该从 7 月 21 日至 7 月 31 日仅获得 10 天按比例分配的叶子。我在这里仅计算(7 月 31 日至 7 月 21 日)/(2.08 * 月天数)

标签: sql-server


【解决方案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,但由于我不知道你的目标是什么,所以我不知道它是否正确。

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

Select  Datediff(day,'21 JULY 2017', EOMONTH('21 JULY 2017')) * 
        (2.08/DAY(EOMONTH('21 JULY 2017'))) 

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多