Mysql 日期1,'%y%m'),日期格式(日期2,'%y%m'))%12, '-', DATEDIFF(日期1,日期(CONCAT(年(日期1),“-”,月(日期1),“-”,日(日期2 ')), “%Y-%m-%d”); 如果结束; 返回dif; 结束$$ 定界符; 任意给定两个日期之间的月差:
我很惊讶这一点还没有被提及: 看看MySQL中的函数 这允许您传递两个Mysql 日期1,'%y%m'),日期格式(日期2,'%y%m'))%12, '-', DATEDIFF(日期1,日期(CONCAT(年(日期1),“-”,月(日期1),“-”,日(日期2 ')), “%Y-%m-%d”); 如果结束; 返回dif; 结束$$ 定界符; 任意给定两个日期之间的月差:,mysql,date,datediff,date-arithmetic,Mysql,Date,Datediff,Date Arithmetic,我很惊讶这一点还没有被提及: 看看MySQL中的函数 这允许您传递两个时间戳或日期时间值(甚至是MySQL将自动转换的日期)以及您希望差异的时间单位 您可以在第一个参数中指定MONTH作为单位: SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-04') -- Outputs: 0 它基本上获取从参数列表中的第一个日期起经过的月数。这个解决方案会自动补偿每个月(28、30、31)不同的天数,并考虑闰年——你不必担心这些事情 精度的月差
时间戳
或日期时间
值(甚至是MySQL将自动转换的日期
)以及您希望差异的时间单位
您可以在第一个参数中指定MONTH
作为单位:
SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-04')
-- Outputs: 0
它基本上获取从参数列表中的第一个日期起经过的月数。这个解决方案会自动补偿每个月(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
您可以通过以下方式获得年、月和日:
SELECT
username
,date_of_birth
,DATE_FORMAT(CURDATE(), '%Y') - DATE_FORMAT(date_of_birth, '%Y') - (DATE_FORMAT(CURDATE(), '00-%m-%d') < DATE_FORMAT(date_of_birth, '00-%m-%d')) AS years
,PERIOD_DIFF( DATE_FORMAT(CURDATE(), '%Y%m') , DATE_FORMAT(date_of_birth, '%Y%m') ) AS months
,DATEDIFF(CURDATE(),date_of_birth) AS days
FROM users
选择
用户名
,出生日期
,日期格式(CURDATE(),'%Y')-日期格式(出生日期,'%Y')-(日期格式(CURDATE(),'00-%m-%d')<日期格式(出生日期,'00-%m-%d')为年
,期间差异(日期格式(CURDATE(),'%Y%m'),日期格式(出生日期,'%Y%m'))作为月份
,DATEDIFF(CURDATE(),出生日期)为天
来自用户
我需要精确的月差。尽管赞恩·宾的解决方案方向正确,但他的第二个和第三个例子给出了不准确的结果。2月的一天除以2月的天数并不等于5月的一天除以5月的天数。所以第二个例子应该输出((31-5+1)/31+13/30=)1.3043,第三个例子((29-27+1)/29+2/30+3=)3.1701
我最后提出了以下问题:
SELECT
'2012-02-27' AS startdate,
'2012-06-02' AS enddate,
TIMESTAMPDIFF(DAY, (SELECT startdate), (SELECT enddate)) AS days,
IF(MONTH((SELECT startdate)) = MONTH((SELECT enddate)), 0, (TIMESTAMPDIFF(DAY, (SELECT startdate), LAST_DAY((SELECT startdate)) + INTERVAL 1 DAY)) / DAY(LAST_DAY((SELECT startdate)))) AS period1,
TIMESTAMPDIFF(MONTH, LAST_DAY((SELECT startdate)) + INTERVAL 1 DAY, LAST_DAY((SELECT enddate))) AS period2,
IF(MONTH((SELECT startdate)) = MONTH((SELECT enddate)), (SELECT days), DAY((SELECT enddate))) / DAY(LAST_DAY((SELECT enddate))) AS period3,
(SELECT period1) + (SELECT period2) + (SELECT period3) AS months
您也可以尝试以下方法:
select MONTH(NOW())-MONTH(table_date) as 'Total Month Difference' from table_name;
或
正如这里的许多答案所示,“正确”的答案完全取决于你需要什么。在我的例子中,我需要四舍五入到最接近的整数 考虑以下例子: 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的答案显然更准确,但太冗长了,我不喜欢。PERIOD\u DIFF()函数
其中一种方法是MySQL PERIOD_DIFF()返回两个期间之间的差值。句点的格式应相同,即YYYYMM或YYMM。需要注意的是,期间不是日期值
代码:
SELECT PERIOD_DIFF(200905,200811);
简单回答,开始日期为INSU frm,结束日期为INSU to
SELECT convert(TIMESTAMPDIFF(year, ins_frm, ins_to),UNSIGNED) as yrs,
mod(TIMESTAMPDIFF(MONTH, ins_frm, ins_to),12) mnths
FROM table_name
享受:)试试这个
SELECT YEAR(end_date)*12 + MONTH(end_date) - (YEAR(start_date)*12 + MONTH(start_date))
可以准确计算月数。“更准确”是令人难以置信的主观日期。例如,如果您所在的企业有月度周期,那么您需要知道两个日期之间有多少个月,这可能比您上面列出的天数更重要。一个月有多长?如果我需要一个月的计数,我不能简单地除以30。这不是正确的答案;你应该在下面标记答案正确。如果你想要完整的月份数,正确地计算闰年和一个月内不同的天数,Max的答案是不正确的
PERIODDIFF
只是取一个YYYYMM值,因此,除非您自己考虑在传递YYYYMM值之前的天数,否则您所计算的只是月数,如果月数少于整数,则四舍五入到最近的月份。见下面赞恩的回答。为什么对periodiff
评论有这么多的赞成票?Perioddiff不取日值,因此如果月份数少于整数,则计算四舍五入到最近月份的月份数。如果月份数可能是11个月零1天,那么12个月,你知道它会做什么吗,但是如果你改为30天-月,那么它仍然是11-11个月,1天将返回11个月,上面的例子。PERIOD_DIFF没有30天月与31天月的区别。你认为你能稍微整理一下并注释一下你的代码,这样就更容易理解了吗?谢谢你!使用DATE\u格式
方法的时间减少了50%,谢谢+1此处为unix时间戳从您的\u表中选择期间\u DIFF(提取(从现在开始的年\u月()),提取(从\u UNIXTIME开始的年\u月(时间,%Y%m%d)),作为月份
这是不正确的,PERIOD_DIFF
不采用天值,因此如果月份数小于整数,则计算月份数,四舍五入到最近的月份。你应该编辑你的答案来澄清这一点。你从哪里得到的关于它们占用36字节的信息?MySQL手册规定时间戳列的存储要求为4字节。现在就开始计划Y2106错误!;-)这是正确的答案,PERIODDIFF
对所选答案的评论的所有向上投票都是非常失败的LeadingHanks,在我的情况下,我需要包含日期,因此我将所有“enddate”替换为“date_add(enddate,interval 1 day)”。那么2014-03-01到2014-05-31将给出3.00而不是2.97。非常感谢……对于“精确的月差:”,特别是thanx。你是我生活的明星。这是正确的答案。正是我要找的!谢谢
SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-15')
-- Outputs: 1
SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-12-16')
-- Outputs: 7
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
)
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
SELECT
username
,date_of_birth
,DATE_FORMAT(CURDATE(), '%Y') - DATE_FORMAT(date_of_birth, '%Y') - (DATE_FORMAT(CURDATE(), '00-%m-%d') < DATE_FORMAT(date_of_birth, '00-%m-%d')) AS years
,PERIOD_DIFF( DATE_FORMAT(CURDATE(), '%Y%m') , DATE_FORMAT(date_of_birth, '%Y%m') ) AS months
,DATEDIFF(CURDATE(),date_of_birth) AS days
FROM users
SELECT
'2012-02-27' AS startdate,
'2012-06-02' AS enddate,
TIMESTAMPDIFF(DAY, (SELECT startdate), (SELECT enddate)) AS days,
IF(MONTH((SELECT startdate)) = MONTH((SELECT enddate)), 0, (TIMESTAMPDIFF(DAY, (SELECT startdate), LAST_DAY((SELECT startdate)) + INTERVAL 1 DAY)) / DAY(LAST_DAY((SELECT startdate)))) AS period1,
TIMESTAMPDIFF(MONTH, LAST_DAY((SELECT startdate)) + INTERVAL 1 DAY, LAST_DAY((SELECT enddate))) AS period2,
IF(MONTH((SELECT startdate)) = MONTH((SELECT enddate)), (SELECT days), DAY((SELECT enddate))) / DAY(LAST_DAY((SELECT enddate))) AS period3,
(SELECT period1) + (SELECT period2) + (SELECT period3) AS months
select MONTH(NOW())-MONTH(table_date) as 'Total Month Difference' from table_name;
select MONTH(Newer_date)-MONTH(Older_date) as 'Total Month Difference' from table_Name;
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
SELECT PERIOD_DIFF(200905,200811);
SELECT convert(TIMESTAMPDIFF(year, ins_frm, ins_to),UNSIGNED) as yrs,
mod(TIMESTAMPDIFF(MONTH, ins_frm, ins_to),12) mnths
FROM table_name
SELECT YEAR(end_date)*12 + MONTH(end_date) - (YEAR(start_date)*12 + MONTH(start_date))