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
'programing' 카테고리의 다른 글
PL/MySQL이 존재합니까? (0) | 2023.10.22 |
---|---|
C에서 주(공)와 주()의 차이 (0) | 2023.10.22 |
팬더 데이터프레임의 전체 열의 하위 문자열 (0) | 2023.10.22 |
계층 이동 및 Maria를 사용하여 데이터베이스에 연결하지 못함DB (0) | 2023.10.22 |
두 번째 테이블의 행이 존재하지 않더라도 오른쪽 조인 (0) | 2023.10.22 |