Månadsskillnad mellan två givna datum:
Jag är förvånad över att detta inte har nämnts ännu:
Ta en titt på TIMESTAMPDIFF() funktion i MySQL.
Vad detta låter dig göra är att passera på två TIMESTAMP
eller DATETIME
värden (eller till och med DATE
som MySQL kommer att konvertera automatiskt) samt den tidsenhet du vill basera din skillnad på.
Du kan ange MONTH
som enhet i den första parametern:
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
Den får i princip antalet månader som har gått från det första datumet i parameterlistan. Den här lösningen kompenserar automatiskt för det varierande antalet dagar i varje månad (28,30,31) samt tar hänsyn till skottår – du behöver inte oroa dig för något av det.
Månadsskillnad med precision:
Det är lite mer komplicerat om du vill införa decimalprecision i antal månader som förflutit, men så här kan du göra det:
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
)
Där startdate
och enddate
är dina datumparametrar, oavsett om det är från två datumkolumner i en tabell eller som inmatningsparametrar från ett skript:
Exempel:
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