Różnica w miesiącu między dowolnymi dwiema datami:
Jestem zaskoczony, że jeszcze o tym nie wspomniano:
Spójrz na TIMESTAMPDIFF() funkcja w MySQL.
To, co pozwala ci to zrobić, to przekazać w dwóch TIMESTAMP
lub DATETIME
wartości (lub nawet DATE
ponieważ MySQL dokona automatycznej konwersji), a także jednostkę czasu, na której chcesz oprzeć swoją różnicę.
Możesz określić MONTH
jako jednostka w pierwszym parametrze:
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
Zasadniczo pobiera liczbę miesięcy, które upłynęły od pierwszej daty na liście parametrów. To rozwiązanie automatycznie kompensuje różną liczbę dni w każdym miesiącu (28,30,31), a także uwzględnia lata przestępne — nie musisz się o nic martwić.
Miesięczna różnica z dokładnością:
To trochę bardziej skomplikowane, jeśli chcesz wprowadzić dokładność dziesiętną w liczbie miesięcy, które upłynęły, ale oto jak możesz to zrobić:
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
)
Gdzie startdate
i enddate
są twoimi parametrami daty, niezależnie od tego, czy pochodzą z dwóch kolumn dat w tabeli, czy jako parametry wejściowe ze skryptu:
Przykłady:
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