我在MySQL表中有两列:
我想运行一个MySQL查询,它将在几个月内提供这两个字段之间的日期差异。
如何在MySQL选择查询中执行此操作?
感谢。
答案 0 :(得分:42)
查看MySQL中的TIMESTAMPDIFF()函数。
这允许你做的是传递两个TIMESTAMP
或DATETIME
值(甚至DATE
,因为MySQL将自动转换)以及你想要的时间单位根据你的差异。
您可以在第一个参数中指定MONTH
作为单位:
SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-04')
-- 0
SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-05')
-- 1
SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-15')
-- 1
SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-12-16')
-- 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
答案 1 :(得分:8)
这可行:
SELECT 12 * (YEAR(DateOfService)
- YEAR(BirthDate))
+ (MONTH(DateOfService)
- MONTH(BirthDate)) AS months
FROM table
答案 2 :(得分:3)
试试这个:
SELECT DATEDIFF(DateOfService, BirthDate) / 30 as months FROM ...
答案 3 :(得分:2)
尝试
PERIOD_DIFF(P1,P2)
返回期间P1和P2之间的月数。 P1和P2的格式应为YYMM
或YYYYMM
。请注意,句点参数P1和P2不是日期值。
的MySQL> SELECT PERIOD_DIFF(200802,200703); - > 11
答案 4 :(得分:1)
TIMESTAMPDIFF(MONTH, Start_date, End_date)
示例:
SELECT TIMESTAMPDIFF(MONTH, BirthDate, DateOfService) AS Months FROM Table
答案 5 :(得分:1)
基于所有答案和Google搜索的摘要,我认为有四种几乎相似的方式来编写它:
1)
TIMESTAMPDIFF(MONTH, Start_date, End_date) AS Period
E.g。
TIMESTAMPDIFF(MONTH, MIN(r.rental_date), MAX(r.rental_date)) AS Period
2)
PERIOD_DIFF(date_format(now(), '%Y%m'), date_format(time, '%Y%m')) as months
或
PERIOD_DIFF(date_format(End_date(), '%Y%m'), date_format(Start_date, '%Y%m')) as months
E.g。
PERIOD_DIFF(date_format(MAX(r.rental_date), '%Y%m'), date_format(MIN(r.rental_date), '%Y%m')) as months
3)
PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM NOW()), EXTRACT(YEAR_MONTH FROM time)) AS months
OR
PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM End_date()), EXTRACT(YEAR_MONTH FROM Start_date)) AS months
E.g。
PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM MAX(r.rental_date)), EXTRACT(YEAR_MONTH FROM MIN(r.rental_date))) as Months
4)
PERIOD_DIFF(concat(year(d1),if(month(d1)<10,'0',''),month(d1)), concat(year(d2),if(month(d2)<10,'0',''),month(d2))) as Months**
E.g。
PERIOD_DIFF(
concat(year(MAX(r.rental_date)),if(month(MAX(r.rental_date))<10,'0',''),month(MAX(r.rental_date))),
concat(year(MIN(r.rental_date)),if(month(MIN(r.rental_date))<10,'0',''),month(MIN(r.rental_date)))
) as Months
答案 6 :(得分:0)
“正确”的答案取决于您的需求。我喜欢四舍五入到最接近的整数。
考虑以下示例: 1月1日 - &gt; 1月31日:整整0个月,差不多1个月。 1月1日 - &gt; 2月1日?它整整一个月,恰好是一个月。
要获得整个个月的数量,请使用:
SELECT TIMESTAMPDIFF(MONTH, '2018-01-01', '2018-01-31'); => 0
SELECT TIMESTAMPDIFF(MONTH, '2018-01-01', '2018-02-01'); => 1
要在几个月内获得舍入持续时间,您可以使用:
SELECT ROUND(TIMESTAMPDIFF(DAY, '2018-01-01', '2018-01-31')*12/365.24); => 1
SELECT ROUND(TIMESTAMPDIFF(DAY, '2018-01-01', '2018-01-31')*12/365.24); => 1
准确度为+/- 5天,范围超过1000年。 Zane的答案显然更准确,但我的喜好太过冗长。