how to get the number on months between two dates in sql server 2005

北战南征 提交于 2019-12-01 03:14:41

问题


I have a column in my sql server 2005 table that should hold the number of months an employee has been in service.

Since I also have the date the employee was engaged, I want the "months_In_Service" column to be a computed column.

Now if I use DATEDIFF(month,[DateEngaged],GETDATE()) as the formula for the months in service computed column, the results are correct some times and other times incorrect.

What would be the better reliable way to get the number of months between the DateEngaged value and the current date? Which formula should i use in my computed column?


回答1:


Something like (might need to swap the 1 and 0, untested)

datediff(month,[DateEngaged],getdate()) +
 CASE WHEN DATEPART(day, [DateEngaged]) < DATEPART(day, getdate()) THEN 1 ELSE 0 END

DATEDIFF measure month boundaries eg 00:00 time on 1st of each month, not day-of-month anniversaries

Edit: after seeing OP's comment, you have to subtract 1 if the start day > end day

DATEDIFF (month, DateEngaged, getdate()) -
 CASE
   WHEN DATEPART(day, DateEngaged) > DATEPART(day, getdate()) THEN 1 ELSE 0
 END

So for 20 Dec to 13 Jan, DATEDIFF gives 1 and then 20 > 13 so subtract 1 = zero months.




回答2:


Same approach as gbn, but with less keystrokes :-)

SELECT 
    DATEDIFF(MONTH, DateEngaged, GETDATE()) +
    CASE 
        WHEN DAY(DateEngaged) < DAY(GETDATE())
        THEN 1 
        ELSE 0 
    END



回答3:


Maybe you want something like:

(year(getdate())-year([DateEngaged]))*12+(month(getdate())-month([DateEngaged]))



回答4:


If You presume that month is meaning for 30 days You can also round vale

round((datediff(day,[DateEngaged],getdate()))/30.00,0)


来源:https://stackoverflow.com/questions/2054975/how-to-get-the-number-on-months-between-two-dates-in-sql-server-2005

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!