首页 > 数据库 >SQL Server 计算年龄函数

SQL Server 计算年龄函数

时间:2022-12-02 10:02:48浏览次数:43  
标签:SET 函数 dbo age birthday datetime DATEPART SQL Server


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


标签:SET,函数,dbo,age,birthday,datetime,DATEPART,SQL,Server
From: https://blog.51cto.com/u_11295556/5905020

相关文章

  • Mysql中文乱码问题(unbutu)
    1.首先查看数据库里面的各种编码格式mysql>showvariableslike"%char%";+--------------------------+---------------+|Variable_name|Value|+--------------------......
  • win10下面部署Mysql数据库
    5.6.24下载地址:​​​http://down10.zol.com.cn/biancgj/mysql_5.6.24_winx64.zip​​下载完成以后解压,在安装目录下面新增my.ini,内容如下:[mysql]#设置mysql客户端默认......
  • Oracle 查询用户下表名,表列数,表行数,表大小的SQL
    最近想分析下数据库的信息,然后写了这个SQL.比较lowB一些. 因为Oracle的deferred_segment_creation参数的影响.很多表如果是0行,那么是不会创建extents存储信息.......
  • mysql8.0使用总结
    1.初始化数据库后,想导入数据,发现报错:ERROR1227(42000)atline75612:Accessdenied;youneed(atleastoneof)theSYSTEM_USERprivilege(s)forthisoperatio......
  • Mysql服务无法启动,服务没有报告任何错误
    场景说明在Window上安装mysql5.7,安装后运行mysql,发现服务无法启动问题解决方法进入mysql的bin目录执行mysqld--initialize-insecure命令第一次执行的话,时间......
  • C#调用父类的父类的方法,甚至祖父类的函数
    C#怎么调用父类甚至祖父类的虚函数在项目开发的时候,有类的继承关系,但是,有时候我们就是需要调用父类或祖父类的方法,怎么办呢?usingSystem;usingSystem.Collections.Gen......
  • OpenCV imread()函数和imwrite()函数路径不能包含中文问题(VS+Qt5)
    1.Qt窗体中无法显示中文在VS中创建qt项目后,在窗体上或者提示信息上,是不支持显示中文的,可以在cpp文件前写一段代码1#ifdefWIN322#pragmaexecution_character_set(......
  • 牛客SQL163
       思路:题目要求我们统计每篇文章的同一时刻最大在线人数,所以我们观察表结构,通过进入时间和离开时间我们知道一个用户什么时候在线,什么时候不在线也就是说一......
  • 真实感渲染:三角函数、向量和矩阵
    大家好~本课程为“真实感渲染”的线上课程,从0开始,介绍相关的图形学算法和数学基础,给出详细的数学推导、伪代码和实现代码,最终带领大家开发出基于物理的渲染器线上课程资料......
  • MySQL NULL--三值逻辑(Three Value Logic)
    三值逻辑(ThreeValueLogic) 对于需求查出含NULL值的数据中,有所有user不等于root的账号: 正确方法一:selectname fromcustomerwhere referee_id!=2or referee......