Как рассчитать разницу между двумя датами в месяцах в MySQL - PullRequest
8 голосов
/ 12 апреля 2011

У меня есть два столбца в таблице MySQL:

  • DateOfService (datetime)
  • Дата рождения (дата)

Я хочу запустить MySQLзапрос, который обеспечит разницу в дате между этими двумя полями в месяцах.

Как я могу сделать это в запросе выбора MySQL?

Спасибо.

Ответы [ 7 ]

42 голосов
/ 30 июля 2012

Посмотрите на функцию TIMESTAMPDIFF () в MySQL.

Что это позволяет сделать, это передать в два TIMESTAMP или DATETIME значений (или даже DATE, поскольку MySQL автоматически преобразует), а также единицу времени, на которой вы хотите основывать разницу.

Вы можете указать MONTH в качестве единицыв первом параметре:

SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-04')
-- 0

SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-05')
-- 1

SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-15')
-- 1

SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-12-16')
-- 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
8 голосов
/ 12 апреля 2011

Это может работать:

SELECT 12 * (YEAR(DateOfService) 
              - YEAR(BirthDate)) 
       + (MONTH(DateOfService) 
           - MONTH(BirthDate)) AS months 
FROM table
2 голосов
/ 13 марта 2013

ПОПРОБУЙТЕ с

PERIOD_DIFF (P1, P2)

Возвращает количество месяцев между периодами P1 и P2. P1 и P2 должны быть в формате YYMM или YYYYMM. Обратите внимание, что аргументы периода P1 и P2 не являются значениями даты.

mysql> SELECT PERIOD_DIFF (200802,200703); -> 11

2 голосов
/ 12 апреля 2011

Попробуйте это:

SELECT DATEDIFF(DateOfService, BirthDate) / 30 as months FROM ...

1 голос
/ 22 февраля 2018

«Правильный» ответ зависит именно от того, что вам нужно.Мне нравится округлять до ближайшего целого числа .

Рассмотрим следующие примеры: 1 января -> 31 января: это 0 целых месяцев и почти 1 месяц.1 января -> 1 февраля?Это 1 целый месяц и ровно 1 месяц.

Чтобы получить число целых месяцев, используйте:

SELECT TIMESTAMPDIFF(MONTH, '2018-01-01', '2018-01-31');  => 0
SELECT TIMESTAMPDIFF(MONTH, '2018-01-01', '2018-02-01');  => 1

Чтобы получить округление продолжительность в месяцах, вы можете использовать:

SELECT ROUND(TIMESTAMPDIFF(DAY, '2018-01-01', '2018-01-31')*12/365.24); => 1
SELECT ROUND(TIMESTAMPDIFF(DAY, '2018-01-01', '2018-01-31')*12/365.24); => 1

Это с точностью до +/- 5 дней и для диапазонов более 1000 лет.Ответ Зейна, очевидно, более точный, но он мне слишком многословен.

1 голос
/ 19 июля 2017

Основываясь на сводке всех ответов и поиске в Google, я думаю, что есть четыре почти одинаковых способа написать:

1)

TIMESTAMPDIFF(MONTH, Start_date, End_date) AS Period

например.

TIMESTAMPDIFF(MONTH, MIN(r.rental_date), MAX(r.rental_date)) AS Period

2)

PERIOD_DIFF(date_format(now(), '%Y%m'), date_format(time, '%Y%m')) as months

или

PERIOD_DIFF(date_format(End_date(), '%Y%m'), date_format(Start_date, '%Y%m')) as months

например.

PERIOD_DIFF(date_format(MAX(r.rental_date), '%Y%m'), date_format(MIN(r.rental_date), '%Y%m')) as months

3)

PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM NOW()), EXTRACT(YEAR_MONTH FROM time)) AS months

ИЛИ

PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM End_date()), EXTRACT(YEAR_MONTH FROM Start_date)) AS months

например.

PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM MAX(r.rental_date)), EXTRACT(YEAR_MONTH FROM MIN(r.rental_date))) as Months

4)

PERIOD_DIFF(concat(year(d1),if(month(d1)<10,'0',''),month(d1)), concat(year(d2),if(month(d2)<10,'0',''),month(d2))) as Months**

например.

PERIOD_DIFF(
            concat(year(MAX(r.rental_date)),if(month(MAX(r.rental_date))<10,'0',''),month(MAX(r.rental_date))),
            concat(year(MIN(r.rental_date)),if(month(MIN(r.rental_date))<10,'0',''),month(MIN(r.rental_date)))
           ) as Months
1 голос
/ 21 ноября 2016
TIMESTAMPDIFF(MONTH, Start_date, End_date)

Пример:

SELECT TIMESTAMPDIFF(MONTH, BirthDate, DateOfService) AS Months FROM Table
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...