如何根据出生日期和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
916554 次浏览
SELECT ID,
Name,
DATEDIFF(yy,CONVERT(DATETIME, DOB),GETDATE()) AS AGE,
DOB
FROM MyTable

您需要考虑datediff命令的查房方式。

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>

我改编自在这里

请注意,对于非闰年,将把2月28日视为闰年的生日,例如,2020年2月29日出生的人将被视为2021年2月28日的1岁生日,而不是2021年3月1日。

我已经在我们的生产代码中使用这个查询近10年了:

SELECT FLOOR((CAST (GetDate() AS INTEGER) - CAST(Date_of_birth AS INTEGER)) / 365.25) AS Age

闰年/日和以下方法有问题,请参阅下面的更新:

试试这个:

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)

更新这里有一些更准确的方法:

多年来最好的方法

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样式(yyyymmdd)到一个数字,你可以使用这样的计算…

(yyyyMMdd - 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

这个怎么样:

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 @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 @DOB datetime
SET @DOB='19851125'
SELECT Datepart(yy,convert(date,GETDATE())-@DOB)-1900

这难道不会避免所有的舍入、截断和抵消问题吗?

试试这个

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'

试试这个解决方案:

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

我相信这是类似于其他张贴在这里....但是这个解决方案适用于闰年1976年2月29日至2011年3月1日的例子,也适用于第一年的情况。比如2011年4月7日到2012年3月7日,上一个关于闰年解决方案的帖子在第一年的用例中不适用。

SELECT FLOOR(DATEDIFF(DAY, @date1 , @date2) / 365.25)

发现在这里

这将正确地处理生日和舍入的问题:

DECLARE @dob  datetime
SET @dob='1992-01-09 00:00:00'


SELECT DATEDIFF(YEAR, '0:0', getdate()-@dob)

所以上面的很多解决方案都是错误的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

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

我们使用了类似的方法,然后取平均年龄:

ROUND(avg(CONVERT(int,DATEDIFF(hour,DOB,GETDATE())/8766.0)),0) AS AverageAge

注意,ROUND是在外面而不是里面。这将允许AVG更准确,我们只舍入一次。也更快了。

标记为正确的答案更接近准确,但是,它在以下情况下失败-其中出生年份为闰年,日在二月之后

declare @ReportStartDate datetime = CONVERT(datetime, '1/1/2014'),
@DateofBirth datetime = CONVERT(datetime, '2/29/1948')


FLOOR(DATEDIFF(HOUR,@DateofBirth,@ReportStartDate )/8766)


OR

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日等。

如果这个公式有漏洞,请指正。

select datediff(day,'1991-03-16',getdate()) \\for days,get date refers today date
select datediff(year,'1991-03-16',getdate()) \\for years
select datediff(month,'1991-03-16',getdate()) \\for month
select DATEDIFF(yy,@DATE,GETDATE()) -
case when DATEPART(mm,GETDATE())*100+DATEPART(dd,GETDATE())>=
DATEPART(mm,@DATE)*100+DATEPART(dd,@DATE) THEN 0
ELSE 1 END
SELECT CAST(DATEDIFF(dy, @DOB, GETDATE()+1)/365.25 AS int)

你应该使用
select FLOOR(DATEDIFF(CURDATE(),DATE(DOB))/365.25) from table_name;
这里CURDATE()使用当前日期,您可以以'yyyy-mm-dd'格式给出自己的日期 DATE(DOB)从DATETIME格式的列中提取yyyy-mm-dd年 这里DOB是你的列名(但你应该改变表修改数据类型为DATETIME在你的情况下是nvarchar) 注意: 此查询用于mysql 此返回年龄在全年

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
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 @yourBirthDate DATETIME = '1987-05-25'
SELECT YEAR(DATEADD(DAY, DATEDIFF(DAY, @yourBirthDate, GETDATE()), CAST('0001-01-01' AS DATETIME2))) - 1

你应按以下方法计算年数:-

select cast(datediff(DAY, '2000-03-01 10:00:01', '2013-03-01 10:00:00') / (365.23076923074) as int) 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

因为没有一个简单的答案总是能给出正确的年龄,下面是我想到的。

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

这将获得出生日期和当前日期之间的年差。如果出生日期还没过,就减去一年。

任何时候都是准确的——不管闰年或离生日有多近。

最棒的是——没有功能。

编辑:这个答案不正确。 我把它留在这里,作为对任何试图使用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

这里有几个关于比较月份和日期的建议。day(有些人搞错了,没有在这里正确地考虑OR !)。但是没有人提供dayofyear,它看起来很简单,而且短得多。我的报价:

DATEDIFF(year, @date, GETDATE()) -
CASE WHEN DATEPART(dayofyear, @date) > DATEPART(dayofyear, GETDATE()) THEN 1 ELSE 0 END

[注意:SQL BOL/MSDN中没有DATEPART(dayofyear, ...)返回的实际记录!]我的理解是1- 366之间的数字;最重要的是,它按照DATEPART(weekday, ...) &SET DATEFIRST。)


编辑: 为什么dayofyear出错:正如用户@AeroX评论的那样,如果出生/开始日期在非闰年的2月之后,当当前/结束日期是闰年时,年龄将提前一天增加,例如'2015-05-26''2016-05-25'给出的年龄为1,而它应该仍然是0。比较不同年份的dayofyear显然是危险的。所以使用MONTH()DAY()毕竟是必要的。

我做了很多思考和研究,我有三个解决方案

  • 正确计算年龄
  • 短(大部分)
  • (大部分)是可以理解的。

以下是测试值:

DECLARE @NOW DATETIME = '2013-07-04 23:59:59'
DECLARE @DOB DATETIME = '1986-07-05'

我在一个js库中找到了这种方法。这是我的最爱。

DATEDIFF(YY, @DOB, @NOW) -
CASE WHEN DATEADD(YY, DATEDIFF(YY, @DOB, @NOW), @DOB) > @NOW THEN 1 ELSE 0 END

它实际上是将年份的差异添加到DOB,如果它比当前日期大,则减去一年。简单的对吧?唯一不同的是,在这里,年龄的差异是相同的。

但是如果你不需要内联使用它,你可以这样写:

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

它基本上是像我们人类一样计算年龄。


我的朋友把它重构成这样:

DATEDIFF(YY, @DOB, @NOW) -
CEILING(0.5 * SIGN((MONTH(@DOB) - MONTH(@NOW)) * 50 + DAY(@DOB) - DAY(@NOW)))

这个是最短的,但也是最难理解的。50只是一个权重,所以只有当月份相同时,日差才重要。SIGN函数用于将得到的任何值转换为- 1,0或1。CEILING(0.5 *Math.max(0, value)是一样的,但是在SQL中没有这样的东西。

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

检查一下下面的答案是否可行。

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
)
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

在尝试了许多方法后,这是100%的工作时间使用现代MS SQL格式函数,而不是转换为风格112。两者都可以,但这是最少的代码。

谁能找到一个日期组合不工作?我不认为有一个:)

--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

一个只有日期函数的解决方案怎么样,不需要数学,不用担心闰年

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
select floor((datediff(day,0,@today) - datediff(day,0,@birthdate)) / 365.2425) as age

这里有很多365.25的答案。记住闰年是如何定义的:

    每四年一次
    • 除了每100年
      • 除了每400年
      • 李< / ul > < / > 李< / ul > < / >
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;

这个问题有很多答案,但我认为这一个更接近事实。

我们都知道,datediff(year,…,…)函数只计算日期部分跨越的边界,在本例中是year。因此,它忽略了一年中的其他时间。

只有当年份从生日开始时,才会给出以完整年份为单位的年龄。它可能不会,但我们可以通过将请求日期调整相同的金额来假装它。

在伪伪代码中,它是这样的:

adjusted_today = today - month(dob) + 1 - day(dob) + 1
age = year(adjusted_today - dob)
  • + 1是为了允许月份和日期从1开始,而不是0
  • 我们把月份和日期分开减去,而不是减去一年中的某一天,是因为二月的长度有令人讨厌的变化趋势。

SQL中的计算是:

datediff(year,dob,dateadd(month,-month(dob)+1,dateadd(day,-day(dob)+1,today)))

其中dobtoday被假定为出生日期和请求日期。

你可以这样测试:

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;

这是乔治·哈里森的完整年龄。

这比摆弄四分之一日要简洁得多,后者通常会在边缘处给出误导性的值。

如果你有机会创建一个标量函数,你可以使用这样的东西:

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(),因为,嗯,微软。

如果你找到你的年龄。 Select (months_between(sysdate,dob)/12) from table_name 如果你找到你的大致年龄。 从table_name中选择round(months_between(sysdate,dob)/12);在这里输入代码 dob是列名。用于当前日期的Sysdate。Months_between用于查找dob到当前日期的总月份

简单明了

SELECT (YEAR(CURRENT_TIMESTAMP) - YEAR(birthday)) as age FROM db_deirvlon_monyo_users