转换varchar值时转换失败' 2年-2个月21天'到数据类型int

时间:2017-02-22 12:10:50

标签: sql sql-server

我正在努力了解员工为公司工作多长时间,我还应该了解员工是否有辞职日期。

但我现在没有这方面的数据,因此我的数据库中此列的值为Null。但是我在我的sql中考虑当它发生时采取辞职日期而不是当前时间但是现在需要工作开始日期和当前时间。我的理论是,如果列辞职日期为空,请采取"当前日期 - 工作开始日期",否则 是否需要辞职日期 - 工作开始日期。

我为这个理论编写了一个SQL查询并且它工作得很好但是当我尝试返回前一个月的工作时间,因为员工工作了多长时间我遇到了一个问题:

a)我在这个错误中挣扎了几个小时,我也尝试转换这些行,我认为它应该被转换,但是它运行不正常,所以当我运行主查询时,我收到此错误:< / p>

> Msg 245, Level 16, State 1, Line 1  
> Conversion failed when converting the varchar value '2 year -2 month 21 day' to data type int. 

我的主要查询如下:

**--- sql for how long employees work with year month day ----**
    CASE
        WHEN Users.ResignationDate IS NOT NULL 
           THEN DATEDIFF(YEAR, WorkStartDate, ResignationDate)
           ELSE CAST(DATEDIFF(yy, WorkStartDate, GETDATE()) AS varchar(4)) + ' year ' +
                CAST(DATEDIFF(mm, DATEADD(yy, DATEDIFF(yy, WorkStartDate, GETDATE()), WorkStartDate), GETDATE()) AS varchar(2)) + ' month ' +
                CAST(DATEDIFF(dd, DATEADD(mm, DATEDIFF(mm, DATEADD(yy, DATEDIFF(yy, WorkStartDate, GETDATE()), WorkStartDate), GETDATE()), DATEADD(yy, DATEDIFF(yy, WorkStartDate, GETDATE()), WorkStartDate)), GETDATE()) AS varchar(2)) +' day'  END as Ancinitet,
        Paychecks.DepartmentName AS Afdelinger
   FROM dbo.Paychecks INNER JOIN  dbo.Users ON Users.Id=Paychecks.UserId
WHERE Users.CustomerId=214 order by Users.FirstName;

2 个答案:

答案 0 :(得分:1)

case表达式返回单个值 - 和单个类型。你的返回两种不同的类型,SQL Server决定适当的返回类型是第一个,一个整数。

只需转换为字符串:

(CASE WHEN Users.ResignationDate IS NOT NULL
      THEN CAST(DATEDIFF(YEAR, WorkStartDate, ResignationDate) as VARCHAR(255))
      ELSE (CAST(DATEDIFF(year, WorkStartDate, GETDATE()) AS varchar(4)) +' year ' +
            CAST(DATEDIFF(month, DATEADD(year, DATEDIFF(year, WorkStartDate, GETDATE()), WorkStartDate), GETDATE()) AS varchar(2)) +' month ' +
            CAST(DATEDIFF(day, DATEADD(month, DATEDIFF(month, DATEADD(year, DATEDIFF(year, WorkStartDate, GETDATE()), WorkStartDate), GETDATE()), DATEADD(year, DATEDIFF(yy, WorkStartDate, GETDATE()), WorkStartDate)), GETDATE()) AS varchar(2)) +' day'
          )
END) as Ancinitet,

我怀疑有更好的方法可以做你想做的事。如果感兴趣,请询问带有样本数据和所需结果的另一个问题。

答案 1 :(得分:0)

这有什么问题?

datediff(year, workStartDate, isNull(resignationDate, getDate()))