Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 日期1,'%y%m'),日期格式(日期2,'%y%m'))%12, '-', DATEDIFF(日期1,日期(CONCAT(年(日期1),“-”,月(日期1),“-”,日(日期2 ')), “%Y-%m-%d”); 如果结束; 返回dif; 结束$$ 定界符; 任意给定两个日期之间的月差:_Mysql_Date_Datediff_Date Arithmetic - Fatal编程技术网

Mysql 日期1,'%y%m'),日期格式(日期2,'%y%m'))%12, '-', DATEDIFF(日期1,日期(CONCAT(年(日期1),“-”,月(日期1),“-”,日(日期2 ')), “%Y-%m-%d”); 如果结束; 返回dif; 结束$$ 定界符; 任意给定两个日期之间的月差:

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中的函数

这允许您传递两个
时间戳
日期时间
值(甚至是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))