Mysql
 sql >> Base de données >  >> RDS >> Mysql

La différence en mois entre les dates dans MySQL

Différence de mois entre deux dates données :

Je suis surpris que cela n'ait pas encore été mentionné :

Jetez un œil au TIMESTAMPDIFF() fonction dans MySQL.

Ce que cela vous permet de faire est de passer en deux TIMESTAMP ou DATETIME valeurs (ou même DATE comme MySQL se convertira automatiquement) ainsi que l'unité de temps sur laquelle vous souhaitez baser votre différence.

Vous pouvez spécifier MONTH comme unité dans le premier paramètre :

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

Il obtient essentiellement le nombre de mois écoulés depuis la première date de la liste des paramètres. Cette solution compense automatiquement le nombre variable de jours de chaque mois (28,30,31) et tient compte des années bissextiles ; vous n'avez pas à vous soucier de tout cela.

Différence mensuelle avec précision :

C'est un peu plus compliqué si vous souhaitez introduire une précision décimale dans le nombre de mois écoulés, mais voici comment procéder :

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
  )

startdate et enddate sont vos paramètres de date, que ce soit à partir de deux colonnes de date dans une table ou en tant que paramètres d'entrée d'un script :

Exemples :

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