5

我的 sql server 2005 表中有一个列,该列应该包含员工服务的月数。

由于我也有员工被聘用的日期,我希望“months_In_Service”列是一个计算列。

现在,如果我使用DATEDIFF(month,[DateEngaged],GETDATE())服务计算列中的月份的公式,结果有时是正确的,有时是不正确的。

获取 DateEngaged 值和当前日期之间的月数的更可靠方法是什么?我应该在计算列中使用哪个公式?

4

4 回答 4

12

类似的东西(可能需要交换 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 = 零个月。

于 2010-01-13T07:12:52.010 回答
4

与 gbn 相同的方法,但击键次数更少 :-)

SELECT 
    DATEDIFF(MONTH, DateEngaged, GETDATE()) +
    CASE 
        WHEN DAY(DateEngaged) < DAY(GETDATE())
        THEN 1 
        ELSE 0 
    END
于 2010-01-13T07:23:59.760 回答
1

也许你想要类似的东西:

(year(getdate())-year([DateEngaged]))*12+(month(getdate())-month([DateEngaged]))
于 2010-01-13T07:13:37.367 回答
-2

如果您假设该月意味着 30 天您也可以舍入 vale

round((datediff(day,[DateEngaged],getdate()))/30.00,0)
于 2010-01-13T07:20:16.887 回答