如何将给定的天数转换成年,月,日MySQL? [英] How to convert given number of days to years, months and days in MySQL?

查看:3299
本文介绍了如何将给定的天数转换成年,月,日MySQL?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试获得贷款和付费日期之间的日期和时间。我使用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':'')
}

下面的函数使用PHP> = 5.2函数,并将日期转换为几年,几个月和日期。

  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':''):'');
}


解决方案

主要问题如下:


  1. 为了找到需要使用 datediff()

  2. datediff()返回差异天数。

  3. 为了将日期转换为日期,你可以得到你需要使用的年数等等。 from_days()

  4. from_days() code>在1582之前没有真正的工作,引用文档:


    使用FROM_DAYS()小心谨慎日期,不适用于在公历日历(1582)之前的值的


    最小m是1582,因为这是欧洲从朱利安转换成格列高利的日历。


  5. 0000-00-00 + 6天是0000-01-06,这是早于1582年。


这实际上意味着MySQL日期功能对你没用。



您要求您在精确MySQL中完成此操作。因为你不能使用日期功能,你将不得不自己组成。这个不会准确。一年有多少天?这肯定不总是365.一个月内有几天?



我强烈建议在PHP中执行此操作。



然而,由于您坚持不想这样做,您将不得不作弊。



将日期1600-01-01添加到一切。然后从你的答案中删除1600年,1个月和1天。我只使用这个日期,因为它大于1582,这是一个很好的轮次。任何事情都可以工作,但越早越好,所以你不会遇到问题。



假设我们已经构建了下表:

 创建表日期(日期,日期); 
insert into dates
values(str_to_date('2012-04-30','%Y-%m-%d')
,str_to_date('2012-04-24',' %Y-%m-%d')
);

插入到日期
值(str_to_date('2012-04-30','%Y-%m-%d')
,str_to_date('2009-05- 24','%Y-%m-%d')
);

以下查询将获得您想要的内容:



- $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ (天)) - 1
(选择to_days(a) - to_days(b)+
to_days(str_to_date('1600-01-01','%Y-%m-%d') )as as
from dates)as b

这是一个SQL小提琴来证明它



再次,这是真的很黑,而不是真的推荐。


I am trying to get the date and time duration between the Loan taken and Paid date. I used the PHP date and time functions, but it is not always accurate. How can I do this accurately in MySQL?

Let assume two dates, The Loan taken date

2009-05-24

and the Loan return date

2012-04-30

I write a MySQL query

SELECT DATEDIFF('2012-04-30', '2009-05-24') `total_days`;

return 1072 days, which is roughly 2 Years, 11 Months, 12 Days.

Please do not answer with PHP code, I already try it. Here is the code.

The function below uses PHP >= 5.3 functions and convert days to years, months and days.

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' : '') : '');
}

The function below uses PHP >= 5.2 functions and convert days to years, months and days.

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' : '') : '');
}

解决方案

The main problem is as follows:

  1. In order to find the difference between days you need to use datediff()
  2. datediff() returns the difference in days.
  3. In order to convert days to a date, so you can get the number of years etc you need to use from_days()
  4. from_days() doesn't really work before 1582, to quote from the documentation:

    "Use FROM_DAYS() with caution on old dates. It is not intended for use with values that precede the advent of the Gregorian calendar (1582)"

    The minimum is 1582 as this was when Europe converted from the Julian to the Gregorian calender.

  5. 0000-00-00 + 6 days is 0000-01-06, which is earlier than 1582.

This effectively means that MySQL date-functions are useless to you.

You ask for this to be done in MySQL "accurately". As you can't use date functions you're going to have to make up your own. This will not be accurate. How many days are there in a year? It's certainly not always 365. How many days are there in a month?

I would highly recommend doing this in PHP.

However, as you're adamant that you don't want to do so, you're going to have to cheat.

Add the date 1600-01-01 to everything. Then remove 1600 years, 1 month and 1 day from your answer at the end. I only use this date because it's greater than 1582 and it's a nice round number. Anything would work really but the earlier the better so you don't run into problems.

Assuming we've built the following table:

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')
        );

The following query will get what you want:

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

Here's a SQL Fiddle to prove it.

Once again, this is really quite hacky and not really recommended.

这篇关于如何将给定的天数转换成年,月,日MySQL?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆