SQL Server 计算年龄函数
- 需要处理的问题
- 实现思路
- 先将int类型转换成datetime
- 创建sqlserver函数
- 创建视图
需要处理的问题
在实际开发过程中,我们经常会遇到动态计算人员年龄的情况,其实如果单纯的计算年龄,其实在应用程序或者sql语句里面处理一下就好了,但是如果需要根据年龄进行筛选并且数据要求分页,这个问题就变的复杂起来,为了已最快的速度解决这个问题,我们就采用创建数据库函数的方式,并且结合表我们和函数结合创建视图,来快速解决相应的需求,解决方案有很多,也许我这种不是性能最优的,我只介绍快速处理问题的方案!我们的数据存储类型也不是datetime类型而是Int类型,所以再处理问题之前我们还需要经过一系列的转换将int类型转换成datetime类型!存取类型如下
-- 20200602000000
实现思路
先将int类型转换成datetime
CONVERT(datetime,CONVERT(varchar(10),CAST(SUBSTRING(CAST(出生年月 AS varchar),0,9) AS datetime),120))
创建sqlserver函数
IF EXISTS(SELECT 1 FROM sysobjects WHERE [name] = 'GetAge')
DROP FUNCTION dbo.GetAge
go
CREATE FUNCTION dbo.GetAge
(
@birthday DATETIME
)
RETURNS INT
AS
BEGIN
IF(@birthday IS NOT NULL AND ISDATE(@birthday) = 1)
BEGIN
DECLARE @age INT , @y INT , @m INT , @d INT , @now DATETIME
SET @now = GETDATE()
SET @y = DATEPART(YEAR,@now) - DATEPART(YEAR,@birthday)
SET @m = DATEPART(MONTH,@now) - DATEPART(MONTH,@birthday)
SET @d = DATEPART(DAY,@now) - DATEPART(DAY,@birthday)
IF(@m = 0 AND @d = 0)
BEGIN
SET @age = @y
END
ELSE
BEGIN
IF @m > 0 OR (@m = 0 AND @d > 0)
SET @age = @y
ELSE
SET @age = @y - 1
END
IF @age < 0 SET @age = 0
END
ELSE
BEGIN
SET @age = NULL
END
RETURN @age
END
创建视图
CREATE VIEW [dbo].[View_RC_PersonnelManage]
AS
SELECT a.*, dbo.GetAge(CONVERT(datetime, CONVERT(varchar(10),
CAST(SUBSTRING(CAST(出生年月 AS varchar), 0, 9) AS datetime), 120))) AS 年龄
FROM dbo.人员信息表 AS a
GO