Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/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
Php 如何在MySQL中将给定的天数转换为年、月和日?_Php_Mysql_Datetime_Datediff - Fatal编程技术网

Php 如何在MySQL中将给定的天数转换为年、月和日?

Php 如何在MySQL中将给定的天数转换为年、月和日?,php,mysql,datetime,datediff,Php,Mysql,Datetime,Datediff,我正在尝试获取贷款获得日期和支付日期之间的时间期限。我使用了PHP的日期和时间函数,但它并不总是准确的。我如何在MySQL中准确地做到这一点 假设有两个日期,贷款日期 2009-05-24 以及归还贷款的日期 2012-04-30 我编写了一个MySQL查询 SELECT DATEDIFF('2012-04-30', '2009-05-24') `total_days`; 返回1072天,大约是2年11个月12天 请不要用PHP代码回答,我已经试过了。这是你的电话号码 代码 下面的函数使用PH

我正在尝试获取贷款获得日期和支付日期之间的时间期限。我使用了PHP的日期和时间函数,但它并不总是准确的。我如何在MySQL中准确地做到这一点

假设有两个日期,贷款日期

2009-05-24

以及归还贷款的日期

2012-04-30

我编写了一个MySQL查询

SELECT DATEDIFF('2012-04-30', '2009-05-24') `total_days`;
返回1072天,大约是2年11个月12天

请不要用PHP代码回答,我已经试过了。这是你的电话号码 代码

下面的函数使用PHP>=5.3函数,并将天转换为年、月和天

function date_interval($date1, $date2)
{
    $date1 = new DateTime($date1);
    $date2 = new DateTime($date2);

    $interval = date_diff($date2, $date1);
    return ((($y = $interval->format('%y')) > 0) ? $y . ' Year' . ($y > 1 ? 's' : '') . ', ' : '') . ((($m = $interval->format('%m')) > 0) ? $m . ' Month' . ($m > 1 ? 's' : '') . ', ' : '') . ((($d = $interval->format('%d')) > 0) ? $d . ' Day' . ($d > 1 ? 's' : '') : '');
}
function date_interval($date1, $date2)
{
    $diff = abs(strtotime($date2) - strtotime($date1));

    $years = floor($diff / (365 * 60 * 60 * 24));
    $months = floor(($diff - $years * 365 * 60 * 60 * 24) / (30 * 60 * 60 * 24));
    $days = floor(($diff - $years * 365 * 60 * 60 * 24 - $months * 30 * 60 * 60 * 24) / (60 * 60 * 24));

    return (($years > 0) ? $years . ' Year' . ($years > 1 ? 's' : '') . ', ' : '') . (($months > 0) ? $months . ' Month' . ($months > 1 ? 's' : '') . ', ' : '') . (($days > 0) ? $days . ' Day' . ($days > 1 ? 's' : '') : '');
}
下面的函数使用PHP>=5.2函数,并将天转换为年、月和天

function date_interval($date1, $date2)
{
    $date1 = new DateTime($date1);
    $date2 = new DateTime($date2);

    $interval = date_diff($date2, $date1);
    return ((($y = $interval->format('%y')) > 0) ? $y . ' Year' . ($y > 1 ? 's' : '') . ', ' : '') . ((($m = $interval->format('%m')) > 0) ? $m . ' Month' . ($m > 1 ? 's' : '') . ', ' : '') . ((($d = $interval->format('%d')) > 0) ? $d . ' Day' . ($d > 1 ? 's' : '') : '');
}
function date_interval($date1, $date2)
{
    $diff = abs(strtotime($date2) - strtotime($date1));

    $years = floor($diff / (365 * 60 * 60 * 24));
    $months = floor(($diff - $years * 365 * 60 * 60 * 24) / (30 * 60 * 60 * 24));
    $days = floor(($diff - $years * 365 * 60 * 60 * 24 - $months * 30 * 60 * 60 * 24) / (60 * 60 * 24));

    return (($years > 0) ? $years . ' Year' . ($years > 1 ? 's' : '') . ', ' : '') . (($months > 0) ? $months . ' Month' . ($months > 1 ? 's' : '') . ', ' : '') . (($days > 0) ? $days . ' Day' . ($days > 1 ? 's' : '') : '');
}

主要问题如下:

  • 为了找出你需要使用的天数之间的差异
  • datediff()
    返回以天为单位的差值
  • 为了将天转换为日期,您可以获得需要使用的年数等
  • from_days()
    在1582年之前不起作用,引用文档:

    “在旧日期使用FROM_DAYS()时要小心。它不适合使用 具有公历(1582)出现之前的价值观”

    最低值为1582年,这是欧洲从儒略历改为格里高利历时的情况

  • 0000-00-00+6天为0000-01-06,早于1582天

  • 这实际上意味着MySQL日期函数对您来说是无用的


    您要求在MySQL中“准确地”完成此操作。因为你不能使用日期函数,所以你必须自己编一个。这是不准确的。一年有多少天?当然不总是365。一个月有多少天

    我强烈建议您使用PHP进行此操作

    然而,当你坚持不想这样做时,你就不得不作弊了

    将日期1600-01-01添加到所有内容。然后在最后从你的答案中去掉1600年,1个月和1天。我只使用这个日期,因为它大于1582,是一个很好的整数。任何事情都会奏效,但越早越好,这样你就不会遇到问题

    假设我们构建了下表:

    create table dates (a date, b date);
    insert into dates
    values ( str_to_date('2012-04-30','%Y-%m-%d')
           , str_to_date('2012-04-24','%Y-%m-%d')
            );
    
    insert into dates
    values ( str_to_date('2012-04-30','%Y-%m-%d')
           , str_to_date('2009-05-24','%Y-%m-%d')
            );
    
    以下查询将获得您想要的内容:

    select extract(year from from_days(days)) - 1600
         , extract(month from from_days(days)) - 1
         , extract(day from from_days(days)) - 1
      from ( select to_days(a) - to_days(b) + 
                    to_days(str_to_date('1600-01-01', '%Y-%m-%d')) as days
               from dates ) as b
    

    再一次,这是一个非常粗糙的方法,不推荐使用。

    使用MySQL的函数:

    SELECT TIMESTAMPDIFF(YEAR
           , '2009-05-24'
           , '2012-04-30'
           ) AS Years,
           TIMESTAMPDIFF(MONTH
           , '2009-05-24'
               + INTERVAL TIMESTAMPDIFF(YEAR, '2009-05-24', '2012-04-30') YEAR
           , '2012-04-30'
           ) AS Months,
           TIMESTAMPDIFF(DAY
           , '2009-05-24'
               + INTERVAL TIMESTAMPDIFF(YEAR, '2009-05-24', '2012-04-30') YEAR
               + INTERVAL TIMESTAMPDIFF(YEAR, '2009-05-24', '2012-04-30') MONTH
           , '2012-04-30'
           ) AS Days
    
    请在上查看。

    我使用了这个:

    SELECT TIMESTAMPDIFF(YEAR
           , '2010-08-29'
           , '2014-09-18'
           ) AS Years,
           TIMESTAMPDIFF(MONTH
           , '2010-08-29'
               + INTERVAL TIMESTAMPDIFF(YEAR, '2010-08-29', '2014-09-18') YEAR
           , '2014-09-18'
           ) AS Months,
           TIMESTAMPDIFF(DAY
           , '2010-08-29'
               + INTERVAL TIMESTAMPDIFF(MONTH, '2010-08-29', '2014-09-18') MONTH
           , '2014-09-18'
           ) AS Days
    

    一个月有多少天?28? 29? 30? 31?在MySQL中,您可能需要一个存储过程或函数来实现这一点。如果差异小于一年,则该函数似乎不起作用。o我没有意识到这一点。很奇怪,MySQL对此问题没有简单的设置。我希望他们能很快扩展功能:)使用PHP版本。2014年。使用来自cjmancor的timestampdiff函数为我工作>timestampdiff(年份,'2010-08-29','2014-09-18')