Разница в месяце между любыми данными двумя датами:
Я удивлен, что это еще не было упомянуто:
Посмотрите на функцию 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), а также учитывает високосные годы & mdash; вам не нужно беспокоиться ни о чем из этого.
Разница в месяц с точностью:
Это немного сложнее, если вы хотите ввести десятичную точность в количестве прошедших месяцев, но вот как вы можете это сделать:
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