Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 转换varchar值时转换失败';2年-2个月21天';到数据类型int_Sql_Sql Server - Fatal编程技术网

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

Sql 转换varchar值时转换失败';2年-2个月21天';到数据类型int,sql,sql-server,Sql,Sql Server,我想知道员工为公司工作了多长时间,我还应该知道是否有员工有辞职日期 但我现在并没有这方面的数据,所以我的数据库中这列的值为Null。但我认为在我的SQL事件发生的时候,以辞职日期代替当前时间,但是现在开始工作开始日期和当前时间。我的理论是,如果列“辞职日期”为空,则取“当前日期-工作开始日期”,否则 是否需要辞职日期-工作开始日期 我为这一理论编写了一个SQL查询,它运行良好,但当我尝试返回员工工作时间的前一年一月日时,我遇到了一个问题,即: a)我与此错误斗争了数小时,我也尝试转换这些行,我认

我想知道员工为公司工作了多长时间,我还应该知道是否有员工有辞职日期

但我现在并没有这方面的数据,所以我的数据库中这列的值为Null。但我认为在我的SQL事件发生的时候,以辞职日期代替当前时间,但是现在开始工作开始日期和当前时间。我的理论是,如果列“辞职日期”为空,则取“当前日期-工作开始日期”,否则 是否需要辞职日期-工作开始日期

我为这一理论编写了一个SQL查询,它运行良好,但当我尝试返回员工工作时间的前一年一月日时,我遇到了一个问题,即:

a)我与此错误斗争了数小时,我也尝试转换这些行,我认为应该转换这些行,但它工作不好,因此,当我运行主查询时,我得到以下错误:

> 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;

这个怎么了

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

case
表达式返回单个值和单个类型。您的返回两种不同的类型,并且SQLServer决定适当的返回类型是第一种,即整数

只要把它放在一根弦上:

(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,

我怀疑有更好的方法来做你想做的事。如果你对此感兴趣,可以用样本数据和期望的结果问另一个问题。

你最好用几周而不是几个月,因为一周总是有7天。你也可以用一个月30天的时间,这通常会让你接近,但你的日子可能会有几天休息

DECLARE @StartDate DATETIME = '20151115',
        @EndDate DATETIME = GETDATE();

SELECT  YearWeekDay = CONCAT(DATEDIFF(DAY, @StartDate, @EndDate) / 365, ' year ', DATEDIFF(DAY, @StartDate, @EndDate) % 365 / 7, ' week ',
                              DATEDIFF(DAY, @StartDate, @EndDate) % 365 % 7, ' day'
                            ),
        YearMonthDay = CONCAT(DATEDIFF(DAY, @StartDate, @EndDate) / 365, ' year ', DATEDIFF(DAY, @StartDate, @EndDate) % 365 / 30, ' month ',
                               DATEDIFF(DAY, @StartDate, @EndDate) % 365 % 30, ' day '
                             ),
        YWDHMS = CONCAT( DATEDIFF(SECOND, @StartDate, @EndDate) / 86400 / 365, 'y ', DATEDIFF(SECOND, @StartDate, @EndDate) / 86400 % 365 / 7, 'w ',
                         DATEDIFF(SECOND, @StartDate, @EndDate) / 86400 % 365 % 7, 'd ', DATEDIFF(SECOND, @StartDate, @EndDate) % 86400 / 3600, 'h ',
                         DATEDIFF(SECOND, @StartDate, @EndDate) % 3600 / 60, 'm ', DATEDIFF(SECOND, @StartDate, @EndDate) % 60, 's '
                       );
输出:

StartDate   EndDate                 YearWeekDay             YearMonthDay            YWDHMS
2015-11-15  2017-02-22 15:11:34.123 1 year 14 week 2 day    1 year 3 month 10 day   1y 14w 2d 15h 11m 34s 

我建议简化查询以隔离问题。我刚刚编辑了查询,请看一看,如果不确定,请告诉我为什么两种情况下显示不同的结果-当辞职日期不为空时,您使用datediff,当为空时,您在输出中添加年、月和日。-在ANSI-92 SQL标准(25年前!)中,用正确的ANSI
JOIN
语法替换了老式的逗号分隔的表列表样式,并且它的使用非常方便discouraged@marc_s,谢谢你的评论,我想知道,你的意思是我的代码中有旧的风格,或者你能给我指出正确的方向吗?我刚刚替换了代码,你写了它,但我得到了这个错误:Msg 241,16级,状态1,从字符串转换日期和/或时间时,第1行转换失败。
WorkStartDate
的数据类型是什么?数据类型是datetime
ResignationDate
?还有datetime for ResignationDate没什么问题,我只希望我的输出在2年2个月2个月前是这样的day@RyaN你已接受的答案返回2015年11月15日的“2年-9个月8天”。这就是你想要的吗?我的回答是“1年3个月10天”或“1年14周2天”。