【问题标题】:how to get the number on months between two dates in sql server 2005如何在sql server 2005中获取两个日期之间的月份数
【发布时间】:2011-01-04 12:39:40
【问题描述】:

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

由于我还有员工的入职日期,我希望“months_In_Service”列是计算列。

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

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

【问题讨论】:

  • 您能否提供一些示例来说明您所说的有时正确有时不正确时的意思。
  • 能否请您重新标记此(编辑)并设置 sql-server-2005(甚至只是 sql-server)?注意破折号。这里有些用户忽略了 SQL Server 问题(不是他们的专业知识)但对 SQL 问题感兴趣。
  • DateEngaged = '12/20/2009" CurrentDate = '1/13/2010" 使用公式“datediff(month,[DateEngaged],getdate()+( 1))" 它还使用公式 "datediff(year,[DateEngaged],getdate()+(1))" 将服务年限设为 1
  • 你期待什么结果?

标签: sql sql-server tsql datetime datediff


【解决方案1】:

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

【讨论】:

  • 这似乎工作正常,只是为了以防万一。
  • 你有没有测试过当员工在 10 月 31 日订婚并且当前日期是 11 月 30 日时会发生什么?这个例程返回 0 个月,但实际上,我能想象到的几乎所有业务需求都会说是一个月。发现这个正在寻找解决这个问题的方法。还在找……
  • 对@Ron 解释的内容不是一个绝妙的解决方案?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    也许你想要类似的东西:

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

    【讨论】:

      【解决方案4】:

      如果你假设那个月代表 30 天你也可以取整 vale

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

      【讨论】:

      • 我完全希望月份表示 30 天和一年十二个月的 30 天(每个!!)。
      • 随着时间的推移,这会越来越远。 6年后,误差为整月,保证
      猜你喜欢
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2010-09-07
      • 2013-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多