mysql - 如何使用 MySQL 查询在月份中获取两个日期之间的差异?

标签 mysql date datediff date-arithmetic

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

有没有比获取 Unix 时间戳然后除以 2 592 000(秒)并在 MySQL 中四舍五入更好的方法?

最佳答案

任何给定两个日期之间的月差:

我很惊讶这还没有被提及:

看看TIMESTAMPDIFF() MySQL 中的函数。

这允许你做的是传入两个 TIMESTAMPDATETIME 值(甚至是 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
  )

其中 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

关于mysql - 如何使用 MySQL 查询在月份中获取两个日期之间的差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/288984/

相关文章:

mysql - 计算两个日期之间的天数,不包括周末(仅限 MySQL)

php - 将数据移动到新的 MySQL

php - 将 mysql 结果 $row 传递给类中的另一个方法

java - 通过验证解析日期

javascript - 鼠标速度跟踪器中的时间

HTML 输入类型日期上的模型中的日期不显示

sql-server - DateDiff 函数 SQL Server

php - 使用InnoDB引擎在mysql中插入单行时是否需要事务?

php - 在mysql中同时选择和更新时出错

mysql - 日期格式的 Datediff