我在作业上遇到问题,需要将日期更改为年数:
创建一个查询,以显示2014年离开B姨妈的那些雇员。
在输出中显示人员编号,雇用日期,任职日期和受雇年限。
最后一列的标题为PeopleID HireDate TermDate Years Employed
1016 2010-06-22 2014-01-15 4
1029 2010-02-10 2014-02-05 4
。
您的输出应如下所示:
select PeopleId, HireDate,TermDate
from WORKERS
where TermDate like '%2014%'
floor(datediff('2010-06-22','2014-01-15', TermDate) / 365) as 'Years Employed'
这是我的代码:
{{1}}
答案 0 :(得分:1)
使用$product
:
DATEDIFF()
答案 1 :(得分:0)
datediff
需要day
作为第一个参数,如下所示:
select
PeopleId,
HireDate,
TermDate,
floor(datediff(day, HireDate, TermDate) / 365) as [Years Employed]
from WORKERS
where year(TermDate) = 2014
答案 2 :(得分:0)
select
PeopleId,
HireDate,
TermDate,
SUM(DATEDIFF(DAY,HireDate,TermDate )) / 365.0 AS YEARS_EMPLOYEED
from WORKERS
where year(TermDate) = 2014
这是一个很好的工作原理教程:
答案 3 :(得分:-1)
datediff
,但是由于datediff
的工作方式,这可能并不是您真正想要的。 datediff
不会计算给定开始时间和结束时间之间的完整甚至部分周期的数量。它计算跨越的时期边界的数量。
这意味着对于所有这些计算:
select datediff(year, '2018-12-31 23:59:59.997', '2019-01-01 00:00:00.000')
,datediff(month, '2018-12-31 23:59:59.997', '2019-01-01 00:00:00.000')
,datediff(day, '2018-12-31 23:59:59.997', '2019-01-01 00:00:00.000')
,datediff(hour, '2018-12-31 23:59:59.997', '2019-01-01 00:00:00.000')
,datediff(minute, '2018-12-31 23:59:59.997', '2019-01-01 00:00:00.000')
,datediff(second, '2018-12-31 23:59:59.997', '2019-01-01 00:00:00.000')
即使两个日期之间仅相差3毫秒,您仍将返回值1
,就像这样:
select datediff(year, '2018-01-01 00:00:00.000', '2019-12-31 23:59:59.997')
也将返回1
,即使周期仅比整整2年短3毫秒。
因此,您需要选择一个较小的期间进行汇总,然后将其划分为年度粒度以获取所需的值。我个人使用平均值年中的小时数,这将考虑leap年。
根据您给出的示例,您可以返回以下任意一项:
select datediff(hour, '2010-06-22', '2014-01-15') / 8766 as WholeYears -- 3
,datediff(hour, '2010-06-22', '2014-01-15') / 8766.0 as DecimalYears -- 3.567419
但是,似乎确实是由谁来布置任务的,他都不知道上述情况,因为他们认为2010年6月和2014年1月之间相差4年,无论从任何角度来看都是错误的。
答案 4 :(得分:-1)
DECLARE @Start DATE ='2010-06-22'
DECLARE @Term DATE = '2014-01-15'
SELECT @Start,@Term,DATEPART(YEAR,@Term)-DATEPART(YEAR,@Start) AS [Years Employed]
OR
SELECT @Start,@Term,DATEDIFF(YEAR,@Start,@Term) AS [Years Employed]
我个人不认为2010年6月的聘用和2014年1月的任期为四年,但这不是我的电话。