MySQL에서의 경과시간 계산(InnoDb)
표에 저장된 사람의 생년월일이 있는 경우dd-mm-yyyy
그리고 현재 날짜에서 빼는데, 날짜는 어떤 형식으로 반환되나요?
이 반환된 형식을 사용하여 다른 사람의 나이를 계산하려면 어떻게 해야 합니까?
다음 기능을 사용할 수 있습니다.
SELECT TIMESTAMPDIFF(YEAR, '1970-02-01', CURDATE()) AS age
값이 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
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
질문 태그가 붙어있기 때문에mysql
저는 다음과 같은 실장을 실시하고 있습니다.다른 RDBMS에도 같은 대안이 있었으면 합니다.SQL은 다음과 같습니다.
select YEAR(now()) - YEAR(dob) - ( DAYOFYEAR(now()) < DAYOFYEAR(dob) ) as age
from table
where ...
이것을 시험해 보세요.
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);
올해 출생 연도(생일 후 올해 몇 살이 되는지)를 반환하고 올해 생일을 맞았는지 여부에 따라 조정한다.
여기에 제시된 다른 방법의 반올림 오류로 인해 문제가 발생하지 않습니다.
여기서부터 자유자재로 적응
간단히 하다
SELECT birthdate, (YEAR(CURDATE())-YEAR(birthdate)) AS age FROM `member`
birthdate는 Birthdate 필드에서 year() 명령에서 year()를 뺀 날짜 이름을 유지하는 필드 이름입니다.
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');
날짜가 Y-m-d 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;
그러기 위해서는 다음 두 가지 방법이 있습니다.
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
'source' 카테고리의 다른 글
소켓 '/var/run/mysqld/mysqld'를 통해 로컬 MySQL 서버에 연결할 수 없습니다.sock' (2 "그런 파일 또는 디렉토리가 없습니다") (0) | 2022.09.05 |
---|---|
함수 매개 변수의 유형을 설정하시겠습니까? (0) | 2022.09.04 |
MySQL은 기존 테이블 열 정렬합니다. (0) | 2022.09.04 |
dup2 및 pipe()를 사용하여 명령어 "ls -l | grep ^d | wc " 를 실행합니다. (0) | 2022.09.04 |
네이티브 스크립트는 vuex 요청이 완료될 때까지 요청을 기다립니다. (0) | 2022.09.04 |