我的 sql server 2005 表中有一个列,该列应该包含员工服务的月数。
由于我也有员工被聘用的日期,我希望“months_In_Service”列是一个计算列。
现在,如果我使用DATEDIFF(month,[DateEngaged],GETDATE())
服务计算列中的月份的公式,结果有时是正确的,有时是不正确的。
获取 DateEngaged 值和当前日期之间的月数的更可靠方法是什么?我应该在计算列中使用哪个公式?
我的 sql server 2005 表中有一个列,该列应该包含员工服务的月数。
由于我也有员工被聘用的日期,我希望“months_In_Service”列是一个计算列。
现在,如果我使用DATEDIFF(month,[DateEngaged],GETDATE())
服务计算列中的月份的公式,结果有时是正确的,有时是不正确的。
获取 DateEngaged 值和当前日期之间的月数的更可靠方法是什么?我应该在计算列中使用哪个公式?
类似的东西(可能需要交换 1 和 0,未经测试)
datediff(month,[DateEngaged],getdate()) +
CASE WHEN DATEPART(day, [DateEngaged]) < DATEPART(day, getdate()) THEN 1 ELSE 0 END
DATEDIFF 测量月份边界,例如每月 1 日的 00:00 时间,而不是每月的周年纪念日
编辑:看到OP的评论后,如果开始日>结束日,则必须减去1
DATEDIFF (month, DateEngaged, getdate()) -
CASE
WHEN DATEPART(day, DateEngaged) > DATEPART(day, getdate()) THEN 1 ELSE 0
END
因此,对于 12 月 20 日至 1 月 13 日,DATEDIFF 给出 1,然后是 20 > 13,因此减去 1 = 零个月。
与 gbn 相同的方法,但击键次数更少 :-)
SELECT
DATEDIFF(MONTH, DateEngaged, GETDATE()) +
CASE
WHEN DAY(DateEngaged) < DAY(GETDATE())
THEN 1
ELSE 0
END
也许你想要类似的东西:
(year(getdate())-year([DateEngaged]))*12+(month(getdate())-month([DateEngaged]))
如果您假设该月意味着 30 天您也可以舍入 vale
round((datediff(day,[DateEngaged],getdate()))/30.00,0)