我在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
我得到了结果.. 所以我不明白这是什么问题。
请帮助我,并提前感谢你
答案 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