Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

A diferença em meses entre datas no MySQL

Diferença de mês entre duas datas:


Estou surpreso que isso ainda não tenha sido mencionado:

Dê uma olhada no TIMESTAMPDIFF() função no MySQL.

O que isso permite que você faça é passar dois TIMESTAMP ou DATETIME valores (ou mesmo DATE como o MySQL irá converter automaticamente), bem como a unidade de tempo na qual você deseja basear sua diferença.

Você pode especificar MONTH como a unidade no primeiro parâmetro:
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

Ele basicamente obtém o número de meses decorridos desde a primeira data na lista de parâmetros. Essa solução compensa automaticamente a quantidade variável de dias em cada mês (28,30,31), além de levar em conta os anos bissextos - você não precisa se preocupar com nada disso.

Diferença de mês com precisão:


É um pouco mais complicado se você quiser introduzir precisão decimal no número de meses decorridos, mas aqui está como você pode fazer isso:
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
  )

Onde startdate e enddate são seus parâmetros de data, seja de duas colunas de data em uma tabela ou como parâmetros de entrada de um script:

Exemplos:
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