我有一个MySQL表的两列两个日期之间的区别:如何计算个月在MySQL
- DateOfService(日期时间)
- 出生日期(日期)
我想运行一个MySQL查询将在几个月内提供这两个字段之间的日期差异。
我该如何在MySQL select查询中做到这一点?
谢谢。
我有一个MySQL表的两列两个日期之间的区别:如何计算个月在MySQL
我想运行一个MySQL查询将在几个月内提供这两个字段之间的日期差异。
我该如何在MySQL select查询中做到这一点?
谢谢。
试试这个:
SELECT DATEDIFF(DateOfService, BirthDate)/30 as months FROM ...
看一看在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
嘿,我能够实现上述结果,但我的条件是,我需要0.5年,1年,1.5年,2年,2.5年等..我怎么能这样做! – Dipen 2015-03-03 07:44:28
TRY与
PERIOD_DIFF(P1,P2)
返回周期P1和P2之间的月数。 P1和P2的格式应为YYMM
或YYYYMM
。请注意,周期参数P1和P2不是日期值。
mysql> SELECT PERIOD_DIFF(200802,200703); - > 11
这不回答这个问题的任择议定书,因为它不接受时间日期格式,甚至日期格式。也许如果这个问题被编辑显示这个,那么我可能会收回我的-1。 – amaster 2013-08-07 15:40:53
TIMESTAMPDIFF(MONTH, Start_date, End_date)
例子:
SELECT TIMESTAMPDIFF(MONTH, BirthDate, DateOfService) AS Months FROM Table
基于所有答案的总结和谷歌搜索,我认为有四个几乎相同的方式来写它:
1)
TIMESTAMPDIFF(MONTH, Start_date, End_date) AS Period
例如
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
例如
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
例如
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**
例如
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
“正确的”答案取决于您所需要的。我喜欢轮最接近的整数。
考虑这些例子: 月1日1至1月> 31:这是全0个月,近1个月之久。 1月1日 - > 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的回答显然更准确,但对我的喜好来说太冗长了。
您能否给您所期望的输出的例子吗?例如:今天是4月12日,我的生日是4月14日或5月12日或5月15日。您希望从查询中获得什么值? – Teetrinker 2011-04-12 10:35:24
重复:http://stackoverflow.com/questions/288984/the-difference-in-months-between-dates-in-mysql – manji 2011-04-12 10:37:37
DateOfService列日期总是会大于出生日期栏。所以我需要从DateOfService中减去BirthDate并计算几个月内的差异。 – Awan 2011-04-12 10:38:02