Frage

Ich möchte die Anzahl der Monate zwischen zwei Datums- und Uhrzeitfeldern berechnen.

Gibt es eine bessere Möglichkeit, als den Unix-Zeitstempel zu erhalten und ihn in MySQL durch 2.592.000 (Sekunden) zu dividieren und aufzurunden?

War es hilfreich?

Lösung

Die DATEDIFF Funktion können Sie die Anzahl der Tage zwischen zwei Daten geben. Welche ist genauer, da ... wie Sie einen Monat definieren? (28, 29, 30 oder 31 Tage?)

Andere Tipps

Month-Differenz zwischen irgendwelchen gegebenen zwei Daten:

Ich bin überrascht, dies wurde noch nicht erwähnt:

Haben Sie einen Blick auf die < strong> TIMESTAMPDIFF () Funktion in MySQL.

Was können Sie ist in zwei TIMESTAMP oder DATETIME Werte Pass tun (oder sogar DATE wie MySQL wird automatisch konvertieren) sowie die Zeiteinheit auf dem Unterschied basieren soll.

Sie können MONTH als Einheit im ersten Parameter angegeben werden:

SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-04')
-- Outputs: 0

SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-05')
-- Outputs: 1

SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-15')
-- Outputs: 1

SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-12-16')
-- Outputs: 7

Es wird im Grunde die Anzahl der Monate ab dem ersten Tag in der Parameterliste verstrichen ist. Diese Lösung gleicht automatisch die unterschiedlichen Anzahl von Tagen in jedem Monat (28,30,31) sowie unter Berücksichtigung der Schaltjahre -. Sie müssen sich keine Sorgen über irgendwelche dieser Sachen


Monat Differenz mit Genauigkeit:

Es ist ein wenig komplizierter, wenn Sie Dezimalgenauigkeit in der Anzahl der Monate verstrichen sind, einführen wollen, aber hier ist, wie Sie es tun können:

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
  )

Wo startdate und enddate Ihre Datumsparameter sind, ob sie von zwei Datumsspalten in einer Tabelle oder als Eingabeparameter aus einem Skript:

Beispiele:

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

PERIOD_DIFF berechnet Monate zwischen zwei Daten.

Um zum Beispiel den Unterschied zwischen jetzt zu berechnen () und eine Zeitspalte in your_table:

select period_diff(date_format(now(), '%Y%m'), date_format(time, '%Y%m')) as months from your_table;

Ich benutze auch PERIODDIFF . Um das Jahr und den Monat nach dem Datum zu erhalten, verwende ich die Funktion EXTRACT :

  SELECT PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM NOW()), EXTRACT(YEAR_MONTH FROM time)) AS months FROM your_table;

Ich ziehe es auf diese Weise, denn jeder wird es klar verstehen, auf den ersten Blick:

SELECT
    12 * (YEAR(to) - YEAR(from)) + (MONTH(to) - MONTH(from)) AS months
FROM
    tab;

Wie viele Antworten hier zeigen, ist die ‚richtige‘ Antwort hängt davon ab, genau das, was Sie brauchen. In meinem Fall muss ich Runde auf die nächste ganze Zahl .

Betrachten Sie diese Beispiele: 1 Januar -> 31. Januar: Es ist 0 ganze Monate und fast 1 Monat lang. 1 Januar -> 1. Februar? Es ist 1 Monat lang, und genau 1 Monat lang.

Um die Anzahl der zu erhalten ganze (komplett) Monate, zu verwenden:

SELECT TIMESTAMPDIFF(MONTH, '2018-01-01', '2018-01-31');  => 0
SELECT TIMESTAMPDIFF(MONTH, '2018-01-01', '2018-02-01');  => 1

Um eine abgerundet Dauer in Monaten, könnten Sie verwenden:

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

Dies zu +/- 5 Tage genau und für Bereiche mehr als 1000 Jahre. Zanes Antwort ist offensichtlich genauer, aber es ist zu ausführlich für meinen Geschmack.

Aus dem MySQL-Handbuch:

  

PERIOD_DIFF (P1, P2)

     

Gibt die Anzahl der Monate zwischen den Perioden P1 und P2. P1 und P2 sollten im Format YYMM oder YYYYMM sein. Beachten Sie, dass die Zeit Argumente P1 und P2 keine Datumswerte sind.

     

mysql> SELECT PERIOD_DIFF (200802,200703);           -> 11

So kann es möglich sein, so etwas zu tun:

Select period_diff(concat(year(d1),if(month(d1)<10,'0',''),month(d1)), concat(year(d2),if(month(d2)<10,'0',''),month(d2))) as months from your_table;

Wo d1 und d2 sind die Datumsausdrücke.

Ich hatte die if () Aussagen zu verwenden, um sicherzustellen, dass die Monate eine zweistellige Zahl wie 02 statt 2

war

Gibt es einen besseren Weg? Ja. Verwenden Sie MySQL-Zeitstempel nicht. Abgesehen von der Tatsache, dass sie 36 Bytes besetzen, sind sie überhaupt nicht bequem, mit zu arbeiten. Ich würde empfehlen, Julian Datum und Sekunden ab Mitternacht für alle Datums- / Zeitwerte. Diese können kombiniert werden, um eine UnixDateTime zu bilden. Wenn dies in einem DWORD (unsigned 4 Byte Integer) gespeichert ist, dann geht den ganzen Weg bis zu 2106 kann als Sekunden seit epoc gespeichert werden, 01.01.1970 DWORD max val = 4294967295 - Ein DWORD kann 136 Jahre von Sekunden

halten

Julian Daten sind sehr schön, mit zu arbeiten, wenn Datumsberechnungen machen UNIXDateTime Werte sind gut, mit zu arbeiten, wenn zu machen Datum / Zeit-Berechnungen Weder sind gut zu sehen, so verwende ich den Zeitstempel, wenn ich eine Spalte müssen, dass ich nicht mit dabei viel Berechnung werden, aber ich möchte ein auf einen Blick Anzeige.

Die Umstellung auf Julian und zurück in guter Sprache sehr schnell durchgeführt werden. Mit Zeiger Ich habe es bis auf etwa 900 Clks (Dies ist auch eine Umwandlung von einem String in eine Integer natürlich)

Wenn Sie in ernsthafte Anwendungen erhalten, die die Finanzmärkte Datum / Uhrzeit Informationen, wie zum Beispiel verwendet, wird Julian Daten De-facto.

Die Abfrage wird wie:

select period_diff(date_format(now(),"%Y%m"),date_format(created,"%Y%m")) from customers where..

Gibt eine Anzahl von Kalendermonate seit dem erstellten Zeitstempel auf einem Kundendatensatz, läßt MySQL intern die Monat Auswahl tun.

DROP FUNCTION IF EXISTS `calcula_edad` $$
CREATE DEFINER=`root`@`localhost` FUNCTION `calcula_edad`(pFecha1 date, pFecha2 date, pTipo char(1)) RETURNS int(11)
Begin

  Declare vMeses int;
  Declare vEdad int;

  Set vMeses = period_diff( date_format( pFecha1, '%Y%m' ), date_format( pFecha2, '%Y%m' ) ) ;

  /* Si el dia de la fecha1 es menor al dia de fecha2, restar 1 mes */
  if day(pFecha1) < day(pFecha2) then
    Set vMeses = VMeses - 1;
  end if;

  if pTipo='A' then
    Set vEdad = vMeses div 12 ;
  else
    Set vEdad = vMeses ;
  end if ;
  Return vEdad;
End

select calcula_edad(curdate(),born_date,'M') --  for number of months between 2 dates

Sie diesen Code ausführen, und es wird eine Funktion datedeifference erstellen, die Ihnen den Unterschied in dem Datumsformat yyyy-mm-dd geben.

DELIMITER $$

CREATE FUNCTION datedifference(date1 DATE, date2 DATE) RETURNS DATE
NO SQL

BEGIN
    DECLARE dif DATE;
    IF DATEDIFF(date1, DATE(CONCAT(YEAR(date1),'-', MONTH(date1), '-', DAY(date2)))) < 0    THEN
                SET dif=DATE_FORMAT(
                                        CONCAT(
                                            PERIOD_DIFF(date_format(date1, '%y%m'),date_format(date2, '%y%m'))DIV 12 , 
                                            '-',
                                            PERIOD_DIFF(date_format(date1, '%y%m'),date_format(date2, '%y%m'))% 12 , 
                                            '-',
                                            DATEDIFF(date1, DATE(CONCAT(YEAR(date1),'-', MONTH(DATE_SUB(date1, INTERVAL 1 MONTH)), '-', DAY(date2))))),
                                        '%Y-%m-%d');
    ELSEIF DATEDIFF(date1, DATE(CONCAT(YEAR(date1),'-', MONTH(date1), '-', DAY(date2)))) < DAY(LAST_DAY(DATE_SUB(date1, INTERVAL 1 MONTH))) THEN
                SET dif=DATE_FORMAT(
                                        CONCAT(
                                            PERIOD_DIFF(date_format(date1, '%y%m'),date_format(date2, '%y%m'))DIV 12 , 
                                            '-',
                                            PERIOD_DIFF(date_format(date1, '%y%m'),date_format(date2, '%y%m'))% 12 , 
                                            '-',
                                            DATEDIFF(date1, DATE(CONCAT(YEAR(date1),'-', MONTH(date1), '-', DAY(date2))))),
                                        '%Y-%m-%d');
    ELSE
                SET dif=DATE_FORMAT(
                                        CONCAT(
                                            PERIOD_DIFF(date_format(date1, '%y%m'),date_format(date2, '%y%m'))DIV 12 , 
                                            '-',
                                            PERIOD_DIFF(date_format(date1, '%y%m'),date_format(date2, '%y%m'))% 12 , 
                                            '-',
                                            DATEDIFF(date1, DATE(CONCAT(YEAR(date1),'-', MONTH(date1), '-', DAY(date2))))),
                                        '%Y-%m-%d');
    END IF;

RETURN dif;
END $$
DELIMITER;

Dies hängt davon ab, wie die Anzahl der Monate definiert werden soll.Beantworten Sie diese Fragen:„Was ist der Unterschied in Monaten:15. Februar 2008 – 12. März 2009‘.Wird es durch eine eindeutige Anzahl von Tagen definiert, die von den Schaltjahren abhängt – um welchen Monat es sich handelt, oder um den gleichen Tag des Vormonats = 1 Monat?

Eine Berechnung für Tage:

15. Februar -> 29 (Schaltjahr) = 14. März 2008 + 365 = 1. März 2009.1. März -> 12. März = 12 Tage.14 + 365 + 12 = 391 Tage.Gesamt = 391 Tage / (durchschnittliche Tage im Monat = 30) = 13,03333

Eine Berechnung von Monaten:

15. Februar 2008 - 15. Februar 2009 = 12. Februar 15 -> 12. März

SELECT * 
FROM emp_salaryrevise_view 
WHERE curr_year Between '2008' AND '2009' 
    AND MNTH Between '12' AND '1'

Ich brauchte Monate Unterschied mit Präzision. Obwohl Zane Bien-Lösung in der richtigen Richtung ist, gibt sein zweites und drittes Beispiel ungenaue Ergebnisse. Ein Tag im Februar durch die Anzahl der Tage im Februar geteilt ist zu einem Tag im Mai durch die Anzahl der Tage im Monat Mai geteilt nicht gleich. So soll das zweite Beispiel Ausgang ((31-5 + 1) / 31 + 13/30 =) 1,3043 und das dritte Beispiel ((29-27 + 1) / 29 + 2/30 + 3 =) 3,1701.

ich mit der folgenden Abfrage endete:

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

Sie können Jahre erhalten, Monate und Tage auf diese Weise:

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

Sie können auch versuchen, diese:

select MONTH(NOW())-MONTH(table_date) as 'Total Month Difference' from table_name;

oder

select MONTH(Newer_date)-MONTH(Older_date) as 'Total Month Difference' from table_Name;

PERIOD_DIFF () Funktion

Eine der Art und Weise ist MySQL PERIOD_DIFF () gibt die Differenz zwischen zwei Perioden. Perioden im selben Format heißt YYYYMM oder YYMM sein sollte. Es ist zu beachten, dass Perioden keine Datumswerte sind.

Code:

SELECT PERIOD_DIFF(200905,200811);

Einfaches Antwort gegeben Startdatum als ins_frm und Enddatum als ins_to

SELECT convert(TIMESTAMPDIFF(year, ins_frm, ins_to),UNSIGNED) as yrs,
       mod(TIMESTAMPDIFF(MONTH, ins_frm, ins_to),12) mnths
FROM table_name

Enjoy:)))

Versuchen Sie, diese

SELECT YEAR(end_date)*12 + MONTH(end_date) - (YEAR(start_date)*12 + MONTH(start_date))

Diese Abfrage arbeitet für mich:)

SELECT * FROM tbl_purchase_receipt
WHERE purchase_date BETWEEN '2008-09-09' AND '2009-09-09'

Es dauert nur zwei Tage, und ruft die Werte zwischen ihnen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top