Programing

MySQL에서 나이 계산 (InnoDb)

lottogame 2020. 12. 6. 20:49
반응형

MySQL에서 나이 계산 (InnoDb)


양식의 테이블에 개인 생년월일이 저장되어 있고 dd-mm-yyyy현재 날짜에서 빼면 날짜가 반환되는 형식은 무엇입니까?

이 반환 된 형식을 사용하여 다른 사람의 나이를 계산하려면 어떻게해야합니까?


값이 DATETIME 데이터 유형으로 저장된 경우 :

SELECT YEAR(CURRENT_TIMESTAMP) - YEAR(dob) - (RIGHT(CURRENT_TIMESTAMP, 5) < RIGHT(dob, 5)) as age 
  FROM YOUR_TABLE

윤년을 고려할 때 덜 정확합니다.

SELECT DATEDIFF(CURRENT_DATE, STR_TO_DATE(t.birthday, '%d-%m-%Y'))/365 AS ageInYears
  FROM YOUR_TABLE t 

TIMESTAMPDIFF(unit, datetime_expr1, datetime_expr2)기능 을 사용할 수 있습니다 .

SELECT TIMESTAMPDIFF(YEAR, '1970-02-01', CURDATE()) AS age

데모


select *,year(curdate())-year(dob) - (right(curdate(),5) < right(dob,5)) as age from your_table

이런 식으로 더 정확한 나이 계산을 위해 생년월일도 고려합니다.


SELECT TIMESTAMPDIFF (YEAR, YOUR_COLUMN, CURDATE()) FROM YOUR_TABLE AS AGE

데모를 보려면 클릭하십시오 ..

단순하지만 우아한 ..


select floor(datediff (now(), birthday)/365) as age

간단히:

DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(`birthDate`)), '%Y')+0 AS age

이 시도:

SET @birthday = CAST('1980-05-01' AS DATE);
SET @today = CURRENT_DATE();

SELECT YEAR(@today) - YEAR(@birthday) - 
  (CASE WHEN
    MONTH(@birthday) > MONTH(@today) OR 
    (MONTH(@birthday) = MONTH(@today) AND DAY(@birthday) > DAY(@today)) 
      THEN 1 
      ELSE 0 
  END);

올해-출생 연도 (생일 이후 올해 몇 살이 될지)를 반환하고 올해 아직 생일이 있는지 여부에 따라 조정됩니다.

여기에 제시된 다른 방법의 반올림 오류가 발생하지 않습니다.

여기 에서 자유롭게 적응


질문에으로 태그가 지정되었으므로 mysql저에게 적합한 다음 구현이 있으며 다른 RDBMS에도 유사한 대안이 있기를 바랍니다. 다음은 SQL입니다.

select YEAR(now()) - YEAR(dob) - ( DAYOFYEAR(now()) < DAYOFYEAR(dob) ) as age 
from table 
where ...

다음은 MySQL에서 나이를 계산하는 방법입니다.

select
  date_format(now(), '%Y') - date_format(date_of_birth, '%Y') - 
  (date_format(now(), '00-%m-%d') < date_format(date_of_birth, '00-%m-%d'))
as age from table

이를 수행하는 함수를 만들 수 있습니다.

drop function if exists getIdade;

delimiter |

create function getIdade( data_nascimento datetime )
returns int
begin
    declare idade int;
    declare ano_atual int;
    declare mes_atual int;
    declare dia_atual int;
    declare ano int;
    declare mes int;
    declare dia int;

    set ano_atual = year(curdate());
    set mes_atual = month( curdate());
    set dia_atual = day( curdate());

    set ano = year( data_nascimento );
    set mes = month( data_nascimento );
    set dia = day( data_nascimento );

    set idade = ano_atual - ano;

    if( mes > mes_atual ) then
            set idade = idade - 1;
    end if;

    if( mes = mes_atual and dia > dia_atual ) then
            set idade = idade - 1;
    end if;

    return idade;
end|

delimiter ;

이제 날짜에서 나이를 얻을 수 있습니다.

select getIdade('1983-09-16');

날짜가 Ymd H : i : s 형식이면 다음과 같이 할 수 있습니다.

select getIdade(substring_index('1983-09-16 23:43:01', ' ', 1));

이 함수는 어디서나 재사용 할 수 있습니다.)


나는 이런 식으로 함수를 사용하는 것을 선호합니다.

DELIMITER $$ DROP FUNCTION IF EXISTS `db`.`F_AGE` $$
    CREATE FUNCTION `F_AGE`(in_dob datetime) RETURNS int(11)
        NO SQL
    BEGIN
       DECLARE l_age INT;
       IF DATE_FORMAT(NOW(  ),'00-%m-%d') >= DATE_FORMAT(in_dob,'00-%m-%d') THEN
          -- This person has had a birthday this year
          SET l_age=DATE_FORMAT(NOW(  ),'%Y')-DATE_FORMAT(in_dob,'%Y');
        ELSE
          -- Yet to have a birthday this year
          SET l_age=DATE_FORMAT(NOW(  ),'%Y')-DATE_FORMAT(in_dob,'%Y')-1;
       END IF;
       RETURN(l_age);
    END $$

    DELIMITER ;

이제 사용

SELECT F_AGE('1979-02-11') AS AGE; 

또는

SELECT F_AGE(date) AS age FROM table;

간단하게

SELECT birthdate, (YEAR(CURDATE())-YEAR(birthdate)) AS age FROM `member` 

birthdate는 생년월일 이름을 유지하는 필드 이름입니다. CURDATE ()는 YEAR () 명령으로 연도에서 생년월일 필드에서 YEAR ()를 뺀 것입니다.


이를 수행하는 두 가지 간단한 방법이 있습니다.

1-

select("users.birthdate",
            DB::raw("FLOOR(DATEDIFF(CURRENT_DATE, STR_TO_DATE(users.birthdate, '%Y-%m-%d'))/365) AS age_way_one"),

2-

select("users.birthdate",DB::raw("(YEAR(CURDATE())-YEAR(users.birthdate)) AS age_way_two"))

참고 URL : https://stackoverflow.com/questions/5773405/calculate-age-in-mysql-innodb

반응형