将日期转换为年数

时间:2019-03-11 12:09:50

标签: sql-server

我在作业上遇到问题,需要将日期更改为年数:

创建一个查询,以显示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}}

5 个答案:

答案 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

这是一个很好的工作原理教程:

https://www.w3schools.com/sql/func_sqlserver_datediff.asp

答案 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月的任期为四年,但这不是我的电话。