Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Der Unterschied in Monaten zwischen Datumsangaben in MySQL

Monatsdifferenz zwischen zwei beliebigen Daten:

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

Sehen Sie sich den TIMESTAMPDIFF() Funktion in MySQL.

Damit können Sie zwei TIMESTAMP übergeben oder DATETIME Werte (oder sogar DATE da MySQL automatisch konvertiert) sowie die Zeiteinheit, auf der Sie Ihre Differenz basieren möchten.

Sie können MONTH angeben als Einheit im ersten Parameter:

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 erhält im Grunde die Anzahl der Monate, die seit dem ersten Datum in der Parameterliste vergangen sind. Diese Lösung kompensiert automatisch die unterschiedliche Anzahl von Tagen in jedem Monat (28, 30, 31) und berücksichtigt Schaltjahre – Sie müssen sich um nichts davon kümmern.

Monatsdifferenz mit Genauigkeit:

Es ist etwas komplizierter, wenn Sie eine Dezimalgenauigkeit in die Anzahl der verstrichenen Monate einführen möchten, 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
  )

Wobei startdate und enddate sind Ihre Datumsparameter, sei es aus 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