생년월일과 getDate()를 기준으로 나이(년)를 계산하는 방법
생년월일(현재 nvarchar(25))과 함께 사람을 나열하는 테이블이 있습니다.
어떻게 그걸 날짜로 환산해서 나이를 몇 살로 계산하면 될까요?
내 데이터는 다음과 같습니다.
ID Name DOB
1 John 1992-01-09 00:00:00
2 Sally 1959-05-20 00:00:00
다음을 보고 싶습니다.
ID Name AGE DOB
1 John 17 1992-01-09 00:00:00
2 Sally 50 1959-05-20 00:00:00
윤년/일 및 다음 방법에 문제가 있습니다. 아래 업데이트를 참조하십시오.
이것을 시험해 보세요.
DECLARE @dob datetime SET @dob='1992-01-09 00:00:00' SELECT DATEDIFF(hour,@dob,GETDATE())/8766.0 AS AgeYearsDecimal ,CONVERT(int,ROUND(DATEDIFF(hour,@dob,GETDATE())/8766.0,0)) AS AgeYearsIntRound ,DATEDIFF(hour,@dob,GETDATE())/8766 AS AgeYearsIntTrunc
출력:
AgeYearsDecimal AgeYearsIntRound AgeYearsIntTrunc --------------------------------------- ---------------- ---------------- 17.767054 18 17 (1 row(s) affected)
여기에서는 보다 정확한 방법을 몇 가지 소개합니다.
INT 년도 최고의 방법
DECLARE @Now datetime, @Dob datetime
SELECT @Now='1990-05-05', @Dob='1980-05-05' --results in 10
--SELECT @Now='1990-05-04', @Dob='1980-05-05' --results in 9
--SELECT @Now='1989-05-06', @Dob='1980-05-05' --results in 9
--SELECT @Now='1990-05-06', @Dob='1980-05-05' --results in 10
--SELECT @Now='1990-12-06', @Dob='1980-05-05' --results in 10
--SELECT @Now='1991-05-04', @Dob='1980-05-05' --results in 10
SELECT
(CONVERT(int,CONVERT(char(8),@Now,112))-CONVERT(char(8),@Dob,112))/10000 AS AgeIntYears
의 내용을 수 .10000
로로 합니다.10000.0
소수점을 얻을 수 있지만 아래 방법만큼 정확하지는 않을 것입니다.
십진수 년의 최적 방법
DECLARE @Now datetime, @Dob datetime
SELECT @Now='1990-05-05', @Dob='1980-05-05' --results in 10.000000000000
--SELECT @Now='1990-05-04', @Dob='1980-05-05' --results in 9.997260273973
--SELECT @Now='1989-05-06', @Dob='1980-05-05' --results in 9.002739726027
--SELECT @Now='1990-05-06', @Dob='1980-05-05' --results in 10.002739726027
--SELECT @Now='1990-12-06', @Dob='1980-05-05' --results in 10.589041095890
--SELECT @Now='1991-05-04', @Dob='1980-05-05' --results in 10.997260273973
SELECT 1.0* DateDiff(yy,@Dob,@Now)
+CASE
WHEN @Now >= DATEFROMPARTS(DATEPART(yyyy,@Now),DATEPART(m,@Dob),DATEPART(d,@Dob)) THEN --birthday has happened for the @now year, so add some portion onto the year difference
( 1.0 --force automatic conversions from int to decimal
* DATEDIFF(day,DATEFROMPARTS(DATEPART(yyyy,@Now),DATEPART(m,@Dob),DATEPART(d,@Dob)),@Now) --number of days difference between the @Now year birthday and the @Now day
/ DATEDIFF(day,DATEFROMPARTS(DATEPART(yyyy,@Now),1,1),DATEFROMPARTS(DATEPART(yyyy,@Now)+1,1,1)) --number of days in the @Now year
)
ELSE --birthday has not been reached for the last year, so remove some portion of the year difference
-1 --remove this fractional difference onto the age
* ( -1.0 --force automatic conversions from int to decimal
* DATEDIFF(day,DATEFROMPARTS(DATEPART(yyyy,@Now),DATEPART(m,@Dob),DATEPART(d,@Dob)),@Now) --number of days difference between the @Now year birthday and the @Now day
/ DATEDIFF(day,DATEFROMPARTS(DATEPART(yyyy,@Now),1,1),DATEFROMPARTS(DATEPART(yyyy,@Now)+1,1,1)) --number of days in the @Now year
)
END AS AgeYearsDecimal
이걸 밖으로 던져버려야겠어112 스타일(yyymmdd)을 사용하여 날짜를 숫자로 변환하면 다음과 같은 계산이 가능합니다.
(yyyMMdd - yyyyMMdd) / 10000 = 전체 연도의 차이
declare @as_of datetime, @bday datetime;
select @as_of = '2009/10/15', @bday = '1980/4/20'
select
Convert(Char(8),@as_of,112),
Convert(Char(8),@bday,112),
0 + Convert(Char(8),@as_of,112) - Convert(Char(8),@bday,112),
(0 + Convert(Char(8),@as_of,112) - Convert(Char(8),@bday,112)) / 10000
산출량
20091015 19800420 290595 29
저는 이 쿼리를 거의 10년 동안 프로덕션 코드에 사용해 왔습니다.
SELECT FLOOR((CAST (GetDate() AS INTEGER) - CAST(Date_of_birth AS INTEGER)) / 365.25) AS Age
dateiff 명령어가 돌아가는 방식을 고려해야 합니다.
SELECT CASE WHEN dateadd(year, datediff (year, DOB, getdate()), DOB) > getdate()
THEN datediff(year, DOB, getdate()) - 1
ELSE datediff(year, DOB, getdate())
END as Age
FROM <table>
내가 여기서 각색한 거야
2020년 2월 29일에 태어난 사람은 2021년 3월 1일이 아닌 2021년 2월 28일에 태어난 것으로 간주한다.
위의 솔루션 중 많은 부분이 잘못된 DateDiff(yy,@Dob,@PassedDate)에서는 두 날짜의 월일을 고려하지 않습니다.또한 다트 부품을 가져다가 제대로 주문하면 비교만 할 수 있습니다.
다음 코드는 매우 간단합니다.
create function [dbo].[AgeAtDate](
@DOB datetime,
@PassedDate datetime
)
returns int
with SCHEMABINDING
as
begin
declare @iMonthDayDob int
declare @iMonthDayPassedDate int
select @iMonthDayDob = CAST(datepart (mm,@DOB) * 100 + datepart (dd,@DOB) AS int)
select @iMonthDayPassedDate = CAST(datepart (mm,@PassedDate) * 100 + datepart (dd,@PassedDate) AS int)
return DateDiff(yy,@DOB, @PassedDate)
- CASE WHEN @iMonthDayDob <= @iMonthDayPassedDate
THEN 0
ELSE 1
END
End
편집: 이 답변은 올바르지 않습니다. 하고 .dayofyear
을 사용법
저처럼 소수 일수로 나누거나 반올림/반올림/반올림 오류를 감수하고 싶지 않다면 @Bacon Bits가 https://stackoverflow.com/a/1572257/489865 위의 투고에서 다음과 같이 말하고 있습니다.
인간의 나이를 말하는 거라면 인간의 나이를 계산하는 방식으로 계산해야 합니다.그것은 지구가 얼마나 빨리 움직이는지 그리고 달력과 관련된 모든 것과 아무 상관이 없다.생년월일과 같은 월일이 경과할 때마다 나이를 1씩 늘립니다.이는 인간이 "나이"라고 말할 때 무엇을 의미하는지 반영하기 때문에 다음이 가장 정확하다는 것을 의미한다.
그 후, 다음과 같은 것을 제공합니다.
DATEDIFF(yy, @date, GETDATE()) -
CASE WHEN (MONTH(@date) > MONTH(GETDATE())) OR (MONTH(@date) = MONTH(GETDATE()) AND DAY(@date) > DAY(GETDATE()))
THEN 1 ELSE 0 END
의 비교에 몇 틀리는 경우도 한 경우도 있습니다.이렇게 하면 월과 일과의 비교는 .OR
★★★★★★★★★★★★★★★★★★).dayofyear
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
DATEDIFF(year, @date, GETDATE()) -
CASE WHEN DATEPART(dayofyear, @date) > DATEPART(dayofyear, GETDATE()) THEN 1 ELSE 0 END
BOL/에는 [SQL BOL/MSDN]이 .DATEPART(dayofyear, ...)
실제로 문서화된 반품!1~366 범위의 수치로 알고 있습니다.가장 중요한 것은 로케일에 따라 변경되지 않습니다.DATEPART(weekday, ...)
&SET DATEFIRST
편집:잘못되는 이유: 사용자 @AeroX가 코멘트한 바와 같이 윤년이 아닌 2월 이후인 경우 현재/종료일이 윤년일 경우 에이지가 하루 일찍 증가합니다.'2015-05-26'
,'2016-05-25'
0.1세 0세 1세입니다.의 비교dayofyear
사용하다MONTH()
★★★★★★★★★★★★★★★★★」DAY()
국국필필필필필필
여기 게재되어 있는 다른 솔루션과 비슷하다고 생각합니다만, 이 솔루션은 윤년도의 예에서 1976년 2월 29일 ~ 2011년 3월 1일에도 유효하고, 첫해에도 유효했습니다.예를 들어 2011년 7월 04일부터 2012년 7월 03일까지 윤년 솔루션에 대해 마지막으로 게시한 것은 첫해 사용 사례에 적용되지 않았습니다.
SELECT FLOOR(DATEDIFF(DAY, @date1 , @date2) / 365.25)
여기서 찾았습니다.
항상 정확한 나이를 알려주는 간단한 답은 한 가지가 없기 때문에, 제가 생각해낸 것은 다음과 같습니다.
SELECT DATEDIFF(YY, DateOfBirth, GETDATE()) -
CASE WHEN RIGHT(CONVERT(VARCHAR(6), GETDATE(), 12), 4) >=
RIGHT(CONVERT(VARCHAR(6), DateOfBirth, 12), 4)
THEN 0 ELSE 1 END AS AGE
이 값은 생년월일과 현재 날짜 사이의 연도 차이를 가져옵니다.그리고 아직 생일이 지나지 않았다면 1년을 빼야 한다.
윤년 또는 생년월일에 얼마나 가까운지에 관계없이 항상 정확합니다.
가장 좋은 점은 기능이 없다는 것입니다.
저는 이 문제에 대해 많은 생각을 하고 찾아봤고, 세 가지 해결책이 있습니다.
- 나이를 정확히 계산하다
- 짧다(단축)
- 이해하기 쉽다
테스트 값은 다음과 같습니다.
DECLARE @NOW DATETIME = '2013-07-04 23:59:59'
DECLARE @DOB DATETIME = '1986-07-05'
해결책 1: 이 접근방식은 1개의 js 라이브러리에서 찾았습니다.내가 제일 좋아하는 거야.
DATEDIFF(YY, @DOB, @NOW) -
CASE WHEN DATEADD(YY, DATEDIFF(YY, @DOB, @NOW), @DOB) > @NOW THEN 1 ELSE 0 END
이것은 실제로 DOB에 년의 차이를 더하고 현재 날짜보다 크면 1년을 빼는 것입니다.간단하죠?다만 여기서 나이 차이가 중복된다는 것 뿐입니다.
그러나 인라인으로 사용할 필요가 없는 경우 다음과 같이 쓸 수 있습니다.
DECLARE @AGE INT = DATEDIFF(YY, @DOB, @NOW)
IF DATEADD(YY, @AGE, @DOB) > @NOW
SET @AGE = @AGE - 1
해결책 2: 이것은 원래 @bacon-bits에서 복사한 것입니다.가장 이해하기 쉽지만 조금 길어요.
DATEDIFF(YY, @DOB, @NOW) -
CASE WHEN MONTH(@DOB) > MONTH(@NOW)
OR MONTH(@DOB) = MONTH(@NOW) AND DAY(@DOB) > DAY(@NOW)
THEN 1 ELSE 0 END
기본적으로 우리 인간처럼 나이를 계산하는 것입니다.
해결책 3: 내 친구는 이를 다음과 같이 리팩터링했습니다.
DATEDIFF(YY, @DOB, @NOW) -
CEILING(0.5 * SIGN((MONTH(@DOB) - MONTH(@NOW)) * 50 + DAY(@DOB) - DAY(@NOW)))
이게 제일 짧지만 제일 이해하기 어려워요. 50
그냥 무게이기 때문에 요일 차이는 달이 같을 때만 중요합니다. SIGN
01에 입니다. -1, 0으로 1로 변환합니다.CEILING(0.5 *
is is is is is와 Math.max(0, value)
SQL sql sql sql sql sql 。
그럼 어떻게 되는 거죠?
DECLARE @DOB datetime
SET @DOB='19851125'
SELECT Datepart(yy,convert(date,GETDATE())-@DOB)-1900
그러면 반올림, 잘라내기, 설정 문제를 피할 수 있지 않을까요?
아래 답변이 가능한지 확인하세요.
DECLARE @BirthDate DATE = '09/06/1979'
SELECT
(
YEAR(GETDATE()) - YEAR(@BirthDate) -
CASE WHEN (MONTH(GETDATE()) * 100) + DATEPART(dd, GETDATE()) >
(MONTH(@BirthDate) * 100) + DATEPART(dd, @BirthDate)
THEN 1
ELSE 0
END
)
select floor((datediff(day,0,@today) - datediff(day,0,@birthdate)) / 365.2425) as age
여기에는 365.25의 답변이 많이 있습니다.윤년이 어떻게 정의되는지 기억하십시오.
- 사행시
- 100년마다만 제외하고
- 400년마다만 제외하고
- 100년마다만 제외하고
이 질문에는 많은 답이 있지만, 저는 이것이 진실에 가깝다고 생각합니다.
datediff(year,…,…)
함수는 이 시시시시시시시 function function function function function function function function function function function function function function function function function function function function function function function.year
그 결과, 그 해의 나머지 기간은 무시됩니다.
이것은 한 해가 생일날 시작하는 경우에만 완성된 해의 나이를 알려준다.그럴 리는 없겠지만, 같은 금액만큼 다시 요청 날짜를 조정하면 가짜로 만들 수 있습니다.
의사 코드에서는 다음과 같습니다.
adjusted_today = today - month(dob) + 1 - day(dob) + 1
age = year(adjusted_today - dob)
+ 1
과 일 가 '월'로 시작하는 한 것입니다.1
and0
.- 일년이 아닌 달과 날을 따로 빼는 이유는 2월은 길이를 바꾸는 성가신 경향이 있기 때문이다.
SQL에서의 계산은 다음과 같습니다.
datediff(year,dob,dateadd(month,-month(dob)+1,dateadd(day,-day(dob)+1,today)))
서 ''는dob
★★★★★★★★★★★★★★★★★」today
생년월일과 요청일로 추정됩니다.
다음과 같이 테스트할 수 있습니다.
WITH dates AS (
SELECT
cast('2022-03-01' as date) AS today,
cast('1943-02-25' as date) AS dob
)
select
datediff(year,dob,dateadd(month,-month(dob)+1,dateadd(day,-day(dob)+1,today))) AS age
from dates;
조지 해리슨의 나이를 알 수 있습니다
이는 일반적으로 가장자리에 잘못된 값을 제공하는 1/4일을 만지작거리는 것보다 훨씬 깨끗합니다.
스칼라 함수를 만들 수 있는 고급 기능이 있는 경우 다음과 같은 기능을 사용할 수 있습니다.
DROP FUNCTION IF EXISTS age;
GO
CREATE FUNCTION age(@dob date, @today date) RETURNS INT AS
BEGIN
SET @today = dateadd(month,-month(@dob)+1,@today);
SET @today = dateadd(day,-day(@dob)+1,@today);
RETURN datediff(year,@dob,@today);
END;
GO
말고 전화 주세요.dbo.age()
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
DECLARE @DOB datetime
set @DOB ='11/25/1985'
select floor(
( cast(convert(varchar(8),getdate(),112) as int)-
cast(convert(varchar(8),@DOB,112) as int) ) / 10000
)
출처 : http://beginsql.wordpress.com/2012/04/26/how-to-calculate-age-in-sql-server/
시험해 보다
DECLARE @date datetime, @tmpdate datetime, @years int, @months int, @days int
SELECT @date = '08/16/84'
SELECT @tmpdate = @date
SELECT @years = DATEDIFF(yy, @tmpdate, GETDATE()) - CASE WHEN (MONTH(@date) > MONTH(GETDATE())) OR (MONTH(@date) = MONTH(GETDATE()) AND DAY(@date) > DAY(GETDATE())) THEN 1 ELSE 0 END
SELECT @tmpdate = DATEADD(yy, @years, @tmpdate)
SELECT @months = DATEDIFF(m, @tmpdate, GETDATE()) - CASE WHEN DAY(@date) > DAY(GETDATE()) THEN 1 ELSE 0 END
SELECT @tmpdate = DATEADD(m, @months, @tmpdate)
SELECT @days = DATEDIFF(d, @tmpdate, GETDATE())
SELECT Convert(Varchar(Max),@years)+' Years '+ Convert(Varchar(max),@months) + ' Months '+Convert(Varchar(Max), @days)+'days'
여러 가지 방법을 시도하면 스타일 112로 변환하는 대신 최신 MS SQL FORMAT 기능을 사용하여 100% 작동합니다.어느 쪽이든 작동하지만 이것은 최소 코드입니다.
작동하지 않는 날짜 조합을 찾을 수 있는 사람이 있습니까?없는 것 같아요:)
--Set parameters, or choose from table.column instead:
DECLARE @DOB DATE = '2000/02/29' -- If @DOB is a leap day...
,@ToDate DATE = '2018/03/01' --...there birthday in this calculation will be
--0+ part tells SQL to calc the char(8) as numbers:
SELECT [Age] = (0+ FORMAT(@ToDate,'yyyyMMdd') - FORMAT(@DOB,'yyyyMMdd') ) /10000
CASE WHEN datepart(MM, getdate()) < datepart(MM, BIRTHDATE) THEN ((datepart(YYYY, getdate()) - datepart(YYYY, BIRTH_DATE)) -1 )
ELSE
CASE WHEN datepart(MM, getdate()) = datepart(MM, BIRTHDATE)
THEN
CASE WHEN datepart(DD, getdate()) < datepart(DD, BIRTHDATE) THEN ((datepart(YYYY, getdate()) - datepart(YYYY, BIRTHDATE)) -1 )
ELSE (datepart(YYYY, getdate()) - datepart(YYYY, BIRTHDATE))
END
ELSE (datepart(YYYY, getdate()) - datepart(YYYY, BIRTHDATE)) END
END
SELECT ID,
Name,
DATEDIFF(yy,CONVERT(DATETIME, DOB),GETDATE()) AS AGE,
DOB
FROM MyTable
이거 어때:
SET @Age = CAST(DATEDIFF(Year, @DOB, @Stamp) as int)
IF (CAST(DATEDIFF(DAY, DATEADD(Year, @Age, @DOB), @Stamp) as int) < 0)
SET @Age = @Age - 1
다음 솔루션을 사용해 보십시오.
declare @BirthDate datetime
declare @ToDate datetime
set @BirthDate = '1/3/1990'
set @ToDate = '1/2/2008'
select @BirthDate [Date of Birth], @ToDate [ToDate],(case when (DatePart(mm,@ToDate) < Datepart(mm,@BirthDate))
OR (DatePart(m,@ToDate) = Datepart(m,@BirthDate) AND DatePart(dd,@ToDate) < Datepart(dd,@BirthDate))
then (Datepart(yy, @ToDate) - Datepart(yy, @BirthDate) - 1)
else (Datepart(yy, @ToDate) - Datepart(yy, @BirthDate))end) Age
이렇게 하면 생일 및 반올림 문제가 올바르게 처리됩니다.
DECLARE @dob datetime
SET @dob='1992-01-09 00:00:00'
SELECT DATEDIFF(YEAR, '0:0', getdate()-@dob)
Ed Harper의 솔루션은 두 날짜 중 월과 날이 1일 이내일 때 틀린 답을 반환하지 않는 가장 간단한 방법입니다.나는 부정적인 나이를 다루기 위해 약간 수정했다.
DECLARE @D1 AS DATETIME, @D2 AS DATETIME
SET @D2 = '2012-03-01 10:00:02'
SET @D1 = '2013-03-01 10:00:01'
SELECT
DATEDIFF(YEAR, @D1,@D2)
+
CASE
WHEN @D1<@D2 AND DATEADD(YEAR, DATEDIFF(YEAR,@D1, @D2), @D1) > @D2
THEN - 1
WHEN @D1>@D2 AND DATEADD(YEAR, DATEDIFF(YEAR,@D1, @D2), @D1) < @D2
THEN 1
ELSE 0
END AS AGE
정답으로 표시된 답은 정확도에 가깝지만, 출생 연도가 윤년이고 날짜가 2월 이후인 시나리오에서는 실패합니다.
declare @ReportStartDate datetime = CONVERT(datetime, '1/1/2014'),
@DateofBirth datetime = CONVERT(datetime, '2/29/1948')
FLOOR(DATEDIFF(HOUR,@DateofBirth,@ReportStartDate )/8766)
또는
FLOOR(DATEDIFF(HOUR,@DateofBirth,@ReportStartDate )/8765.82) -- Divisor is more accurate than 8766
--다음의 솔루션을 사용하면, 보다 정확한 결과를 얻을 수 있습니다.
FLOOR(DATEDIFF(YEAR,@DateofBirth,@ReportStartDate) - (CASE WHEN DATEADD(YY,DATEDIFF(YEAR,@DateofBirth,@ReportStartDate),@DateofBirth) > @ReportStartDate THEN 1 ELSE 0 END ))
윤년, 2월 29일 등으로 간주되는 거의 모든 시나리오에서 작동했습니다.
이 공식에 허점이 있으면 정정해 주세요.
Declare @dob datetime
Declare @today datetime
Set @dob = '05/20/2000'
set @today = getdate()
select CASE
WHEN dateadd(year, datediff (year, @dob, @today), @dob) > @today
THEN datediff (year, @dob, @today) - 1
ELSE datediff (year, @dob, @today)
END as Age
여기 생년월일과 현재 날짜가 주어진 나이를 계산하는 방법이 있습니다.
select case
when cast(getdate() as date) = cast(dateadd(year, (datediff(year, '1996-09-09', getdate())), '1996-09-09') as date)
then dateDiff(yyyy,'1996-09-09',dateadd(year, 0, getdate()))
else dateDiff(yyyy,'1996-09-09',dateadd(year, -1, getdate()))
end as MemberAge
go
CREATE function dbo.AgeAtDate(
@DOB datetime,
@CompareDate datetime
)
returns INT
as
begin
return CASE WHEN @DOB is null
THEN
null
ELSE
DateDiff(yy,@DOB, @CompareDate)
- CASE WHEN datepart(mm,@CompareDate) > datepart(mm,@DOB) OR (datepart(mm,@CompareDate) = datepart(mm,@DOB) AND datepart(dd,@CompareDate) >= datepart(dd,@DOB))
THEN 0
ELSE 1
END
END
End
GO
DECLARE @FromDate DATETIME = '1992-01-2623:59:59.000',
@ToDate DATETIME = '2016-08-10 00:00:00.000',
@Years INT, @Months INT, @Days INT, @tmpFromDate DATETIME
SET @Years = DATEDIFF(YEAR, @FromDate, @ToDate)
- (CASE WHEN DATEADD(YEAR, DATEDIFF(YEAR, @FromDate, @ToDate),
@FromDate) > @ToDate THEN 1 ELSE 0 END)
SET @tmpFromDate = DATEADD(YEAR, @Years , @FromDate)
SET @Months = DATEDIFF(MONTH, @tmpFromDate, @ToDate)
- (CASE WHEN DATEADD(MONTH,DATEDIFF(MONTH, @tmpFromDate, @ToDate),
@tmpFromDate) > @ToDate THEN 1 ELSE 0 END)
SET @tmpFromDate = DATEADD(MONTH, @Months , @tmpFromDate)
SET @Days = DATEDIFF(DAY, @tmpFromDate, @ToDate)
- (CASE WHEN DATEADD(DAY, DATEDIFF(DAY, @tmpFromDate, @ToDate),
@tmpFromDate) > @ToDate THEN 1 ELSE 0 END)
SELECT @FromDate FromDate, @ToDate ToDate,
@Years Years, @Months Months, @Days Days
윤년에 대한 걱정이 없고 수학이 아닌 날짜 함수만 있는 솔루션은 어떻습니까?
CREATE FUNCTION dbo.getAge(@dt datetime)
RETURNS int
AS
BEGIN
RETURN
DATEDIFF(yy, @dt, getdate())
- CASE
WHEN
MONTH(@dt) > MONTH(GETDATE()) OR
(MONTH(@dt) = MONTH(GETDATE()) AND DAY(@dt) > DAY(GETDATE()))
THEN 1
ELSE 0
END
END
declare @birthday as datetime
set @birthday = '2000-01-01'
declare @today as datetime
set @today = GetDate()
select
case when ( substring(convert(varchar, @today, 112), 5,4) >= substring(convert(varchar, @birthday, 112), 5,4) ) then
(datepart(year,@today) - datepart(year,@birthday))
else
(datepart(year,@today) - datepart(year,@birthday)) - 1
end
다음 스크립트는 현재와 지정된 생년월일의 차이를 확인합니다.두 번째 부분은 생일이 현재 연도에 이미 지났는지 여부를 확인합니다.그렇지 않은 경우 뺍니다.
SELECT year(NOW()) - year(date_of_birth) - (CONCAT(year(NOW()), '-', month(date_of_birth), '-', day(date_of_birth)) > NOW()) AS Age
FROM tableName;
언급URL : https://stackoverflow.com/questions/1572110/how-to-calculate-age-in-years-based-on-date-of-birth-and-getdate
'itsource' 카테고리의 다른 글
MySQL 열거형 데이터 유형과 동일한 SQL Server? (0) | 2023.04.07 |
---|---|
NULL의 <>!= 연산자가 동일하지 않습니다. (0) | 2023.04.07 |
현재 데이터베이스 백업이 없으므로 백업 로그를 수행할 수 없습니다. (0) | 2023.04.07 |
고유 제약 조건에 대한 명명 규칙 (0) | 2023.04.07 |
SQL-Server:백업 세트는 기존 데이터베이스 이외의 백업을 보유하고 있습니다. (0) | 2023.04.07 |