从SQL中的Birthday函数计算Age

时间:2014-12-17 20:31:39

标签: sql-server date-arithmetic

我在SQL中创建了一个函数来计算生日的年龄,它是这样的:

FUNCTION [dbo].[GetAge] (@birthday datetime, @date datetime)
RETURNS int
AS
BEGIN
return datediff(SECOND, @birthday, @date) / (365.23076923074 * 24 * 60 * 60)
END

生日的格式为:1963-01-01 00:00:00.000

我的问题是,当我这样调用函数时:

SELECT dbo.GetAge(birthday, '2014-12-17 00:00:00')
  FROM [dbo].[Users]
GO

它说:

 Msg 535, Level 16, State 0, Line 3
The datediff function resulted in an overflow. The number of dateparts separating two date/time instances is too large. Try to use datediff with a less precise datepart.

但我用相同的日期调用相同的函数:

SELECT dbo.GetAge(birthday, '1963-01-01 00:00:00')
      FROM [dbo].[Users]
    GO

我得到了结果.. 所以我不明白这是什么问题。

请帮助我,并提前感谢你

5 个答案:

答案 0 :(得分:1)

错误说明了一切。 “尝试使用具有不太精确的datepart的datediff”

return DATEDIFF(DAY, '1963-01-01 00:00:00', '2014-12-17 00:00:00') / (365.23076923074)

答案 1 :(得分:0)

似乎很明显......从用户的生日到今天的秒数对于MySQL用于DATEDIFF的数据类型来说太多了。但是从1963年1月1日开始并没有太多。

答案 2 :(得分:0)

更改您的功能以使用不太精确的datepart,即minute代替second

FUNCTION [dbo].[GetAge] (@birthday datetime, @date datetime)
RETURNS int
AS
BEGIN
return datediff(MINUTE, @birthday, @date) / (365.23076923074 * 24 * 60)
END

hour

FUNCTION [dbo].[GetAge] (@birthday datetime, @date datetime)
RETURNS int
AS
BEGIN
return datediff(HOUR, @birthday, @date) / (365.23076923074 * 24)
END

DAY

FUNCTION [dbo].[GetAge] (@birthday datetime, @date datetime)
RETURNS int
AS
BEGIN
return datediff(DAY, @birthday, @date) / (365.23076923074)
END

答案 3 :(得分:0)

为什么不只是DATEDIFF(year, @birthday, @date)?你只需要整整几年,对吗?

答案 4 :(得分:0)

尝试将生日发送到约会,然后再发送。

SELECT dbo.GetAge(birthday, select cast('1963-01-01 00:00:00.000' as date))
  FROM [dbo].[Users]
GO