programing

두 날짜의 차이를 어떻게 구합니까?

goodjava 2022. 11. 5. 17:50

두 날짜의 차이를 어떻게 구합니까?

MySQL 데이터베이스를 사용하여 두 날짜의 차이를 알고 싶습니다.

예를 들어 다음과 같습니다.

  • 2011-07-20 - 2011-07-18 => 0년
  • 2011-07-20 - 2010-07-20 => 1년
  • 2011-06-15 - 2008-04-11 => 2개 3년
  • 2011-06-11 - 2001-10-11 => 9년

SQL 구문은 어떻습니까?결과를 내기 위해 MySQL에서 내장된 기능이 있습니까?

윤년에 해당하는 표현은 다음과 같습니다.

YEAR(date1) - YEAR(date2) - (DATE_FORMAT(date1, '%m%d') < DATE_FORMAT(date2, '%m%d'))

이것은 이 표현에 적합하기 때문에(DATE_FORMAT(date1, '%m%d') < DATE_FORMAT(date2, '%m%d'))truedate1이 date2보다 "year"인 경우 mysql에서는true = 1그리고.false = 0따라서 조정은 단순히 비교의 "진실"을 빼는 문제일 뿐이다.

이것은 테스트 #3을 제외하고 테스트 케이스에 대한 정확한 값을 제공합니다. 테스트 #1과 일치하려면 "3"이 되어야 한다고 생각합니다.

create table so7749639 (date1 date, date2 date);
insert into so7749639 values
('2011-07-20', '2011-07-18'),
('2011-07-20', '2010-07-20'),
('2011-06-15', '2008-04-11'),
('2011-06-11', '2001-10-11'),
('2007-07-20', '2004-07-20');
select date1, date2,
YEAR(date1) - YEAR(date2)
    - (DATE_FORMAT(date1, '%m%d') < DATE_FORMAT(date2, '%m%d')) as diff_years
from so7749639;

출력:

+------------+------------+------------+
| date1      | date2      | diff_years |
+------------+------------+------------+
| 2011-07-20 | 2011-07-18 |          0 |
| 2011-07-20 | 2010-07-20 |          1 |
| 2011-06-15 | 2008-04-11 |          3 |
| 2011-06-11 | 2001-10-11 |          9 |
| 2007-07-20 | 2004-07-20 |          3 |
+------------+------------+------------+

'SQLFiddle

Bohemian의 솔루션도 좋지만 timestampdiff를 사용하면 어떨까?

select date1, date2,timestampdiff(YEAR,date2,date1) from so7749639

스컬피들

더 쉬워보여요

mysql> SELECT FLOOR(DATEDIFF('2011-06-11','2001-10-11')/365);
+------------------------------------------------+
| FLOOR(DATEDIFF('2011-06-11','2001-10-11')/365) |
+------------------------------------------------+
|                                              9 |
+------------------------------------------------+
1 row in set (0.00 sec)

DATIFF()는 두 날짜 간의 차이를 일 단위로 반환합니다.이것은 특별히 윤년을 고려하지는 않지만 다음과 같은 경우에 효과가 있을 수 있습니다.

mysql> SELECT FLOOR(DATEDIFF('2007-07-11','2004-07-11')/365);
+------------------------------------------------+
| FLOOR(DATEDIFF('2007-07-11','2004-07-11')/365) |
+------------------------------------------------+
|                                              3 |
+------------------------------------------------+
1 row in set (0.00 sec)

간단한 방법:SELECT TIMESTAMPDIFF(YEAR, date1, date2) AS difference FROM table.

당신은 그냥 사용할 수 있다

SELECT ROUND((TO_DAYS(date2) - TO_DAYS(date1)) / 365) ...

포장도 같이 해 주세요.ABS()다른 날짜보다 앞쪽에 있는 날짜에 관계없이 항상 양수를 원할 경우.

와 함께ROUND()0.6년은 1년으로 간주됩니다.대신 전체 연도만 계산하려면 다음을 사용할 수 있습니다.FLOOR()이 경우 0.6년은 0년으로, 1.9년은 1년으로 간주됩니다.

date1과 date2 사이의 연도 수:

IF((YEAR(date2) - YEAR(date1)) > 0, (YEAR(date2) - YEAR(date1)) - (MID(date2, 6, 5) < 
MID(date1, 6, 5)), IF((YEAR(date2) - YEAR(date1)) < 0, (YEAR(date2) - YEAR(date1)) + 
(MID(date1, 6, 5) < MID(date2, 6, 5)), (YEAR(date2) - YEAR(date1))))

이제 이들에 대한 몇 가지 의견을 말씀드리겠습니다.

  1. 이러한 결과는 년, 월 및 일 수를 정수로 반환합니다.그것들은 "바닥"이다.따라서 1.4일은 1일, 13.9년은 13년으로 표시됩니다.마찬가지로 -1.4년은 -1년으로 표시되고 -13.9개월은 -13개월로 표시됩니다.

  2. 대부분의 경우 부울식을 사용합니다.부울식은 0 또는 1로 평가되므로 조건에 따라 합계에서 1을 빼거나 더하는 데 사용할 수 있습니다.

이는 윤년을 감안하더라도 잘 작동합니다.

select floor((cast(date_format('2016-02-14','%Y%m%d') as int) - cast(date_format('1966-02-15','%Y%m%d') as int)/10000);

대부분의 경우 소수점 이하가 틀리기 때문에 바닥을 유지합니다.

언급URL : https://stackoverflow.com/questions/7749639/how-to-get-the-difference-in-years-from-two-different-dates