programing

MySQL에서 두 날짜 간의 연도 차이를 정수로 가져옵니다.

newsource 2023. 10. 22. 20:04

MySQL에서 두 날짜 간의 연도 차이를 정수로 가져옵니다.

저는 데이터베이스에 있는 사람의 나이를 계산하려고 합니다.
다음과 같은 간단한 테이블이 있다고 가정해 보겠습니다.

student(id, birth_date);

여기서 id는 기본 키입니다(실제로 테이블이 더 복잡하지만 단순화했습니다).
저는 한 사람의 나이를 알고 싶습니다.

select id, datediff(curdate(),birth_date) 
from student

하지만 결과는 몇 년이 아니라 며칠 안에 나타납니다.365로 나눌 수 있습니다.

select id, datediff(curdate(),birth_date) / 365
from student

하지만 부동 소수점 값을 반환하고, 정수를 원합니다.
그래서 연도를 계산할 수 있었습니다.

select id, year(curdate())-year(birth_date) 
from student

그러나 문제가 하나 있습니다. 예를 들어 지금이 5월인데, 1970년 6월에 태어난 사람이 전쟁을 한다면 그는 아직 32살이 아니라 31살이 남았지만, 32살이라는 표현이 돌아온다는 것입니다.
저는 이 문제에서 벗어날 수가 없는데, 누가 도와줄 수 있나요?

이 사실을 알게 된 사람은 누구나:

이 작업을 수행할 수 있는 또 다른 방법은 다음과 같습니다.

SELECT TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) AS difference FROM student

월 단위의 차이에 대해서는 교체YEAR와 함께MONTH, 그리고 며칠동안은 교체합니다.YEAR와 함께DAY

select id, floor(datediff(curdate(),birth_date) / 365)
from student

결과를 정수로 바닥재를 깔면 어떨까요?

시도:

SELECT 
  DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birth_date)), '%Y')+0
  AS age FROM student;

합격된 답변은 거의 맞지만 잘못된 결과를 초래할 수 있습니다.

실은./ 365윤년을 고려하지 않으며 생년월일과 일/월이 동일한 날짜를 비교하면 잘못된 결과를 초래할 수 있습니다.

좀 더 정확한 방법은 4년 동안 년 평균 일로 나누어야 하는데, 일명 (365 * 4) + 1 (4년마다 윤년) => 365.25

그리고 당신은 더 정확해질 것입니다.

select id, floor(datediff(curdate(),birth_date) / 365.25) from student

내 프로젝트 중 하나에 대해 테스트를 했는데 잘 되고 있습니다.

두 번째 접근 방식의 출력에 MySQL의 플로어() 함수를 사용하는 것은 어떨까요?분수가 있으면 원하는 결과를 얻을 수 있습니다.

저는 그의 코드를 개선하기 위해 Rat-a-tat-a-tat Ratatouille의 답변에 의견을 덧붙일 만큼 평판이 좋지 않습니다.더 나은 SQL 쿼리는 다음과 같습니다.

SELECT IFNULL(TIMESTAMPDIFF(YEAR, birthdate, CURDATE()), YEAR(CURDATE()) - YEAR(birthdate)) AS age

생년월일에는 생년월일만 포함될 수 있고 일과 월은 0이므로 더 좋습니다. TIMEPSDIFF()가 NULL을 반환하면 생년월일에서 현재 연도를 차감하여 대략적인 나이를 알 수 있습니다.

이것을 이용하여 정수 값을 얻을 수 있습니다.

select id, CAST(datediff(curdate(),birth_date) / 365 as int)
from student

에 대해 읽고 싶다면,CONVERT()그리고.CAST() 링크는 여기 있습니다.

다음과 같이 제안합니다.

DATE_FORMAT(NOW(),"%Y")
   -DATE_FORMAT(BirthDate,'%Y')
   -(
     IF(
      DATE_FORMAT(NOW(),"%m-%d") < DATE_FORMAT(BrthDate,'%m-%d'),
      1,
      0
     )
    ) as Age

이것은 윤년에 매우 잘 작동할 것입니다 ;-

윤년을 고려해도 효과가 있습니다!

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

꼭 지켜주세요.floor()십진법은 필요없으므로

언급URL : https://stackoverflow.com/questions/10506731/get-difference-in-years-between-two-dates-in-mysql-as-an-integer