Месечна разлика между дадени две дати:
Изненадан съм, че това все още не е споменато:
Разгледайте TIMESTAMPDIFF() функция в MySQL.
Това, което ви позволява да направите, е да подадете две TIMESTAMP
или DATETIME
стойности (или дори DATE
тъй като MySQL автоматично ще конвертира), както и единицата време, на която искате да базирате разликата си.
Можете да посочите MONTH
като единица в първия параметър:
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
По принцип получава броя на месеците, изминали от първата дата в списъка с параметри. Това решение автоматично компенсира различното количество дни във всеки месец (28,30,31), както и взема предвид високосните години — не е нужно да се притеснявате за тези неща.
Месечна разлика с точност:
Малко по-сложно е, ако искате да въведете десетична точност в броя на изминалите месеци, но ето как можете да го направите:
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
и enddate
са вашите параметри за дата, независимо дали са от две колони за дата в таблица или като входни параметри от скрипт:
Примери:
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