4

我有两个具有以下表达式的计算列(MonthsInService 和 YearsInService)。

服务月数 =(datediff(month,[DateEngaged],getdate()))

服务年限 =(datediff(month,[DateEngaged],getdate())/(12))

现在,例如 DateEngaged = 2012-April-09 且 getdate() 为 2013-April-08,MonthsInService 返回 12 而 YearsInService 为 1。

我的申请要求 YearsInService 为零,因为距离员工一周年还有一天时间。

我什至不确定如何最好地处理 MonthsInService 列,因为月份的天数不同。

4

3 回答 3

5

不幸的是,DATEDIFF它计算元素的转换次数,而不是通常的人类直觉对两个日期之间的差异(例如DATEDIFF(year,'20121231','20130101')是 1,尽管没有多少人会说有一年的差异)。

我使用的解决方案有点重复,但不需要单独的函数,并且总是得到正确的闰年:

declare @T table (
    DateEngaged datetime not null,
    MonthsInService as CASE
        WHEN DATEADD(month,DATEDIFF(month,DateEngaged,GETDATE()),DateEngaged) > GETDATE()
            THEN DATEDIFF(month,DateEngaged,GETDATE()) - 1
            ELSE DATEDIFF(month,DateEngaged,GETDATE())
        END,
    YearsInService as CASE
        WHEN DATEADD(year,DATEDIFF(year,DateEngaged,GETDATE()),DateEngaged) > GETDATE()
            THEN DATEDIFF(year,DateEngaged,GETDATE()) - 1
            ELSE DATEDIFF(year,DateEngaged,GETDATE())
        END
)

insert into @T (DateEngaged) values ('20120409'),('20120408')

select * from @T

产生:

DateEngaged             MonthsInService YearsInService
----------------------- --------------- --------------
2012-04-09 00:00:00.000 11              0
2012-04-08 00:00:00.000 12              1

它的工作原理是询问“如果我们采用由 产生的幼稚答案DATEDIFF,它给出的答案是否太高了 1?” - 如果是这样,我们只需从它给出的答案中减去一个。DATEDIFF应该只超过 1。

于 2013-04-08T13:39:12.553 回答
1

通过使用day,您可以达到结果:

select 
datediff(month,'2012-April-09','2013-April-08') MonthsInService
,datediff(day,'2012-April-09','2013-April-08')/365 YearsInService

输出

12  0  

或使用函数以获得最大精度:

CREATE FUNCTION [dbo].[getFullYears] 
(
    @dateX datetime,
    @dateY datetime
)  
RETURNS int
AS  
BEGIN 
    DECLARE @y int
    SET @y =DATEDIFF(year,@dateX,@dateY)
    IF (@dateY < DATEADD(year, @y, @dateX)) SET @y = @y -1
    RETURN @y
END

select dbo.getFullYears('2012-April-09','2013-April-09') --1
select dbo.getFullYears('2012-April-09','2013-April-08') --0

对于月份计算,您可以参考这里:Calculating number of full months between two dates in SQL

于 2013-04-08T10:59:41.207 回答
0

试试这个查询:

DATEDIFF(DAY, CONVERT(date, dtmDOB),                         
  CONVERT(date, GETDATE()))*(12.0/365.25)),1))                      
  AS TotalMonths,         
于 2021-10-25T18:30:06.150 回答