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