[mysql] MySQL의 날짜 간의 월 차이

두 날짜 시간 필드 사이의 개월 수를 계산하려고합니다.

유닉스 타임 스탬프를 얻고 2 592 000 (초)로 나누고 MySQL을 반올림하는 것보다 더 좋은 방법이 있습니까?



답변

DATEDIFF의 함수는 두 날짜 사이에 당신의 일 수를 제공 할 수 있습니다. 어느 쪽이 더 정확합니까? 왜냐하면 … 한 달을 어떻게 정의합니까? (28 일, 29 일, 30 일 또는 31 일?)


답변

주어진 두 날짜 간의 월 차이 :

나는 이것이 아직 언급되지 않은 것에 놀랐다.

MySQL 의 TIMESTAMPDIFF () 함수를 살펴보십시오 .

이것이 당신이 할 수있는 것은 차이를 기반으로 할 시간 단위뿐만 아니라 두 개의 TIMESTAMP또는 DATETIME값 (또는 DATEMySQL이 자동 변환되는 것처럼)을 전달하는 것입니다.

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
  )

어디 startdateenddate날짜 매개 변수는 테이블 또는 스크립트에서 입력 매개 변수로 두 개의 날짜 열에서 수 있는지 여부입니다 :

예 :

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


답변

PERIOD_DIFF 는 두 날짜 사이의 월을 계산합니다.

예를 들어 now ()와 your_table의 시간 열 간의 차이를 계산하려면 다음을 수행하십시오.

select period_diff(date_format(now(), '%Y%m'), date_format(time, '%Y%m')) as months from your_table;


답변

나는 또한 PERIODDIFF를 사용합니다 . 날짜의 연도와 월을 얻으려면 EXTRACT 함수를 사용합니다 .

  SELECT PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM NOW()), EXTRACT(YEAR_MONTH FROM time)) AS months FROM your_table;


답변

여기에있는 많은 답변에서 알 수 있듯이 ‘정답’은 정확히 필요한 것에 따라 다릅니다. 제 경우 에는 가장 가까운 정수반올림 해야합니다 .

다음 예를 고려하십시오. 1 월 1 일-> 1 월 31 일 : 전체 0 개월, 거의 1 개월 길이입니다. 1 월 1 일-> 2 월 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 년 이상의 범위에 대해 정확합니다. Zane의 대답은 분명히 더 정확하지만 내 취향에 비해 너무 장황합니다.


답변

MySQL 매뉴얼에서 :

PERIOD_DIFF (P1, P2)

기간 P1과 P2 사이의 개월 수를 반환합니다. P1 및 P2는 YYMM 또는 YYYYMM 형식이어야합니다. 기간 인수 P1 및 P2는 날짜 값이 아닙니다.

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

따라서 다음과 같이 할 수 있습니다.

Select period_diff(concat(year(d1),if(month(d1)<10,'0',''),month(d1)), concat(year(d2),if(month(d2)<10,'0',''),month(d2))) as months from your_table;

여기서 d1 및 d2는 날짜 표현식입니다.

월이 2가 아닌 02와 같은 두 자리 숫자인지 확인하기 위해 if () 문을 사용해야했습니다.


답변

evryone이 언뜻보기에 명확하게 이해할 것이기 때문에 저는이 방법을 선호합니다.

SELECT
    12 * (YEAR(to) - YEAR(from)) + (MONTH(to) - MONTH(from)) AS months
FROM
    tab;