Разница в месяцах между датами в MySQL - PullRequest
67 голосов
/ 14 ноября 2008

Я рассчитываю количество месяцев между двумя полями даты и времени.

Есть ли лучший способ, чем получить метку времени Unix и делить на 2 592 000 (секунд) и округлить в пределах MySQL?

Ответы [ 20 ]

2 голосов
/ 04 ноября 2010
DROP FUNCTION IF EXISTS `calcula_edad` $$
CREATE DEFINER=`root`@`localhost` FUNCTION `calcula_edad`(pFecha1 date, pFecha2 date, pTipo char(1)) RETURNS int(11)
Begin

  Declare vMeses int;
  Declare vEdad int;

  Set vMeses = period_diff( date_format( pFecha1, '%Y%m' ), date_format( pFecha2, '%Y%m' ) ) ;

  /* Si el dia de la fecha1 es menor al dia de fecha2, restar 1 mes */
  if day(pFecha1) < day(pFecha2) then
    Set vMeses = VMeses - 1;
  end if;

  if pTipo='A' then
    Set vEdad = vMeses div 12 ;
  else
    Set vEdad = vMeses ;
  end if ;
  Return vEdad;
End

select calcula_edad(curdate(),born_date,'M') --  for number of months between 2 dates
1 голос
/ 25 мая 2017

Мне нужна была разница в месяц с точностью. Хотя решение Зейна Бина идет в правильном направлении, его второй и третий примеры дают неточные результаты. День в феврале, деленный на количество дней в феврале, не равен дню в мае, деленному на число дней в мае. Таким образом, второй пример должен вывести ((31-5 + 1) / 31 + 13/30 =) 1.3043, а третий пример ((29-27 + 1) / 29 + 2/30 + 3 =) 3.1701.

Я получил следующий запрос:

SELECT
    '2012-02-27' AS startdate,
    '2012-06-02' AS enddate,
    TIMESTAMPDIFF(DAY, (SELECT startdate), (SELECT enddate)) AS days,
    IF(MONTH((SELECT startdate)) = MONTH((SELECT enddate)), 0, (TIMESTAMPDIFF(DAY, (SELECT startdate), LAST_DAY((SELECT startdate)) + INTERVAL 1 DAY)) / DAY(LAST_DAY((SELECT startdate)))) AS period1,     
    TIMESTAMPDIFF(MONTH, LAST_DAY((SELECT startdate)) + INTERVAL 1 DAY, LAST_DAY((SELECT enddate))) AS period2,
    IF(MONTH((SELECT startdate)) = MONTH((SELECT enddate)), (SELECT days), DAY((SELECT enddate))) / DAY(LAST_DAY((SELECT enddate))) AS period3,
    (SELECT period1) + (SELECT period2) + (SELECT period3) AS months
1 голос
/ 14 ноября 2008

Это зависит от того, как вы хотите определить количество месяцев. Ответьте на следующие вопросы: «Какая разница в месяцах: 15 февраля 2008 г. - 12 марта 2009 г.». Определяется ли оно четким числом # дней, которое зависит от високосных лет - какой это месяц или тот же день предыдущего месяца = 1 месяц

Расчет для Дней :

15 февраля -> 29 (високосный год) = 14 1 марта 2008 г. + 365 = 1 марта 2009 г. 1 марта -> 12 марта = 12 дней. 14 + 365 + 12 = 391 день. Итого = 391 день / (среднее число дней в месяце = 30) = 13,03333

Расчет месяцев :

15 февраля 2008 г. - 15 февраля 2009 г. = 12 15 февраля -> 12 марта = менее 1 месяца Итого = 12 месяцев или 13, если 15 февраля - 12 марта считается «прошедшим месяцем»

1 голос
/ 27 января 2009
SELECT * 
FROM emp_salaryrevise_view 
WHERE curr_year Between '2008' AND '2009' 
    AND MNTH Between '12' AND '1'
0 голосов
/ 25 апреля 2019

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

SELECT YEAR(end_date)*12 + MONTH(end_date) - (YEAR(start_date)*12 + MONTH(start_date))
0 голосов
/ 12 февраля 2019

Простой ответ с указанием даты начала в виде ins_frm и даты окончания в виде ins_to

SELECT convert(TIMESTAMPDIFF(year, ins_frm, ins_to),UNSIGNED) as yrs,
       mod(TIMESTAMPDIFF(MONTH, ins_frm, ins_to),12) mnths
FROM table_name

Наслаждайтесь:)))

0 голосов
/ 31 августа 2018

PERIOD_DIFF () функция

Одним из способов является то, что MySQL PERIOD_DIFF () возвращает разницу между двумя периодами. Периоды должны быть в одном и том же формате, то есть ГГГГММ или ГГММ. Следует отметить, что периоды не являются значениями даты.

Код:

SELECT PERIOD_DIFF(200905,200811);

enter image description here

0 голосов
/ 14 декабря 2017

Вы также можете попробовать это:

select MONTH(NOW())-MONTH(table_date) as 'Total Month Difference' from table_name;

OR

select MONTH(Newer_date)-MONTH(Older_date) as 'Total Month Difference' from table_Name;
0 голосов
/ 06 июня 2014

Вы можете получить годы, месяцы и дни следующим образом:

SELECT 
username
,date_of_birth
,DATE_FORMAT(CURDATE(), '%Y') - DATE_FORMAT(date_of_birth, '%Y') - (DATE_FORMAT(CURDATE(), '00-%m-%d') < DATE_FORMAT(date_of_birth, '00-%m-%d')) AS years
,PERIOD_DIFF( DATE_FORMAT(CURDATE(), '%Y%m') , DATE_FORMAT(date_of_birth, '%Y%m') ) AS months
,DATEDIFF(CURDATE(),date_of_birth) AS days
FROM users
0 голосов
/ 09 мая 2010

Этот запрос работал у меня:)

SELECT * FROM tbl_purchase_receipt
WHERE purchase_date BETWEEN '2008-09-09' AND '2009-09-09'

Просто взять две даты и получить значения между ними.

...