Sql 转换varchar值时转换失败';2年-2个月21天';到数据类型int
我想知道员工为公司工作了多长时间,我还应该知道是否有员工有辞职日期 但我现在并没有这方面的数据,所以我的数据库中这列的值为Null。但我认为在我的SQL事件发生的时候,以辞职日期代替当前时间,但是现在开始工作开始日期和当前时间。我的理论是,如果列“辞职日期”为空,则取“当前日期-工作开始日期”,否则 是否需要辞职日期-工作开始日期 我为这一理论编写了一个SQL查询,它运行良好,但当我尝试返回员工工作时间的前一年一月日时,我遇到了一个问题,即: a)我与此错误斗争了数小时,我也尝试转换这些行,我认为应该转换这些行,但它工作不好,因此,当我运行主查询时,我得到以下错误:Sql 转换varchar值时转换失败';2年-2个月21天';到数据类型int,sql,sql-server,Sql,Sql Server,我想知道员工为公司工作了多长时间,我还应该知道是否有员工有辞职日期 但我现在并没有这方面的数据,所以我的数据库中这列的值为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
的数据类型是什么?数据类型是datetimeResignationDate
?还有datetime for ResignationDate没什么问题,我只希望我的输出在2年2个月2个月前是这样的day@RyaN你已接受的答案返回2015年11月15日的“2年-9个月8天”。这就是你想要的吗?我的回答是“1年3个月10天”或“1年14周2天”。