MySQL中日期之间以月份为单位的差异

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (21)

我想计算两个日期时间字段之间的月数。

有没有比获得Unix时间戳和除以2,592,000(秒)和舍入MySQL更好的方法?

提问于
用户回答回答于

DATEDIFF函数可以给出两个日期之间的天数。哪个更准确,因为...你如何定义一个月?(28,29,30或31天?)

用户回答回答于

可以指定MONTH作为第一个参数中的单元:

SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-04')
-- Outputs: 0

SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-05')
-- Outputs: 1

SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-15')
-- Outputs: 1

SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-12-16')
-- Outputs: 7

它基本上是从参数列表中的第一个日期开始计算的月数。这个解决方案会自动补偿每个月的不同天数(28,30,31天),同时考虑到闰年--你不必担心这些事情。


精确月差:

如果想要在经过的月数中引入十进制精度,这会稍微复杂一些,但是下面是如何做到的:

SELECT 
  TIMESTAMPDIFF(MONTH, startdate, enddate) +
  DATEDIFF(
    enddate,
    startdate + INTERVAL
      TIMESTAMPDIFF(MONTH, startdate, enddate)
    MONTH
  ) /
  DATEDIFF(
    startdate + INTERVAL
      TIMESTAMPDIFF(MONTH, startdate, enddate) + 1
    MONTH,
    startdate + INTERVAL
      TIMESTAMPDIFF(MONTH, startdate, enddate)
    MONTH
  )

何地startdateenddate您的日期参数是来自表中的两个日期列,还是作为脚本中的输入参数:

例子:

With startdate = '2012-05-05' AND enddate = '2012-05-27':
-- Outputs: 0.7097

With startdate = '2012-05-05' AND enddate = '2012-06-13':
-- Outputs: 1.2667

With startdate = '2012-02-27' AND enddate = '2012-06-02':
-- Outputs: 3.1935

扫码关注云+社区