2012-05-26 10 views
7

Ich versuche, das Datum und die Dauer zwischen dem Loan genommen und Paid Datum zu erhalten. Ich habe die Datums- und Uhrzeitfunktionen von PHP verwendet, aber es ist nicht immer genau. Wie kann ich das in MySQL genau machen?Wie konvertiert man die angegebene Anzahl von Tagen in Jahre, Monate und Tage in MySQL?

zwei Daten Nehmen wir an, das Darlehen Aufnahmedatum

2009-05-24

und das Darlehen Rückgabedatum

2012-04-30

Ich schreibe eine MySQL-Abfrage

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

Rückkehr 1072 Tage, das ist ungefähr 2 Jahre, 11 Monate, 12 Tage.

Bitte antworten Sie nicht mit PHP-Code, ich versuche es bereits. Hier ist der Code .

Die folgende Funktion verwendet PHP> = 5.3 Funktionen und konvertiert Tage in Jahre, Monate und Tage.

Die folgende Funktion verwendet PHP> = 5.2 Funktionen und konvertiert Tage in Jahre, Monate und Tage.

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

Wie viele Tage in einem Monat da? 28? 29? 30? 31? – liquorvicar

+0

Sie werden wahrscheinlich eine gespeicherte Prozedur oder Funktion benötigen, um das in MySQL zu tun. – liquorvicar

Antwort

5

Das Hauptproblem ist wie folgt:

  1. Um den Unterschied zwischen den Tagen Sie datediff()
  2. datediff() gibt die Differenz in Tagen verwenden müssen zu finden.
  3. Um Tage zu einem Datum zu konvertieren, so dass Sie die Anzahl der Jahre erhalten können usw. Sie vor 1582 from_days()
  4. from_days() nicht wirklich verwenden müssen arbeiten, aus der Dokumentation zu zitieren:

    „Use FROM_DAYS() mit Vorsicht auf alte Daten. Es ist nicht für den Einsatz mit Werten bestimmt, die die Einführung des gregorianischen Kalenders vorausgehen (1582)“

    Das Minimum ist 1582 als das war, als Europa umgerechnet von der Julianische zum Gregorianischen Kalender.

  5. 0000-00-00 + 6 Tage 0000-01-06, die früher als 1582.

Diese effektiv bedeutet, dass MySQL Datum-Funktionen sind nutzlos für Sie.

Sie bitten, dies in MySQL "genau" getan werden.Da Sie keine Datumsfunktionen verwenden können, müssen Sie sich Ihre eigenen zusammenstellen. Diese nicht genau sein. Wie viele Tage gibt es in einem Jahr? Es ist sicher nicht immer 365. Wie viele Tage gibt es in einem Monat?

würde ich tun dies in PHP sehr empfehlen.

Da Sie jedoch darauf bestehen, dass Sie dies nicht tun wollen, müssen Sie schummeln.

Fügen Sie das Datum 1600-01-01 zu alles hinzu. Entferne dann am Ende 1600 Jahre, 1 Monat und 1 Tag von deiner Antwort. Ich verwende nur dieses Datum, weil es größer ist als 1582 und es ist eine schöne runde Zahl. Alles, was funktionieren würde wirklich, aber je früher desto besser, so laufen Sie nicht in Probleme.

Angenommen, wir die folgende Tabelle erstellt haben:

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

Die folgende Abfrage erhalten, was Sie wollen:

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.

Noch einmal, das ist wirklich ganz hacky und nicht wirklich zu empfehlen.

+0

Es ist ziemlich seltsam, mysql hat nichts einfach eingerichtet für dieses Problem. Ich hoffe sie werden bald die Funktionalität erweitern :) –

+0

@Adrius, ich bezweifle es :-). – Ben

+0

die PHP-Version verwendet. Im Jahr 2014. – topher

0
SELECT DATE_FORMAT(FROM_DAYS(DATEDIFF('2012-04-30', '2009-05-24')), '%Y-%m-%d') AS `total_days` 
+1

Die Funktion scheint nicht zu funktionieren, wenn der Unterschied weniger als ein Jahr ist. Ich war mir dessen nicht bewusst. –

4

Ilses MySQL TIMESTAMPDIFF() Funktion:

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 

es Siehe auf sqlfiddle.

2

Ich habe diese:

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 
Verwandte Themen