内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用
我想计算两个日期时间字段之间的月数。
有没有比获得Unix时间戳和除以2,592,000(秒)和舍入MySQL更好的方法?
我很惊讶这件事还没被提及:
看一下TIMESTAMPDIFF()函数在MySQL中。
这样你就可以把它一分为二了TIMESTAMP
或DATETIME
价值(或甚至DATE
因为MySQL将自动转换)以及您想要的时间单位,
可以指定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 )
何地startdate
和enddate
日期参数是来自表中的两个日期列,还是作为脚本中的输入参数:
例子:
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