1 SET ANSI_NULLS ON 2 GO 3 SET QUOTED_IDENTIFIER ON 4 GO 5 6 CREATE FUNCTION [dbo].[GetAge] 7 ( 8 @birthday datetime, --出生日期 9 @visitdate datetime 10 ) 11 RETURNS nvarchar(10) 12 AS 13 BEGIN 14 -- Declare the return variable here 15 declare @age int --年龄 16 declare @unit nvarchar(10) --单位 17 declare @result nvarchar(20) --总结果 18 SET @age = 0; 19 SET @result='0'; 20 if(@visitdate is null) 21 begin 22 set @visitdate = GETDATE(); 23 end 24 25 IF(@birthday > GETDATE()) 26 BEGIN 27 SET @birthday = GETDATE(); 28 END 29 30 31 32 --1天以内:X小时[X分钟] 33 34 --2.1天至1月以内:X天[X小时] 35 36 --3.1月至1岁以内:X月[X天] 37 38 --4.1岁至儿童年龄上限:X岁[X月] 39 40 --5.>=儿童年龄上限:X岁 41 42 --说明:1天以内,是指按出生日期24小时算 43 44 --1月以内,是指对天计算 45 46 --比如:7.8日出生,8.8日才算1月 47 48 --1岁以内,也是对天计算 49 50 --“以内”都是指“<” 51 52 -- 儿童上限:12岁 53 54 --------------------------12岁以上开始------------------------------------------------- 55 -->=12 显示岁 56 IF(datediff(month,@birthday, @visitdate) >= 144) 57 BEGIN 58 --如果当前月份>=出生时的月份,取正常岁数 59 IF(DATEPART(MONTH,@visitdate) >= DATEPART(MONTH,@birthday)) 60 BEGIN 61 --如果当前日期>=出生时的日期,取正常岁数 62 IF(DATEPART(DAY,@visitdate) >= DATEPART(DAY,@birthday)) 63 BEGIN 64 --SET @age = datediff(year, @birthday,@visitdate); 65 --SET @unit = '岁'; 66 SET @result=CONVERT(VARCHAR(10), datediff(year, @birthday,@visitdate)) + '岁'; 67 END 68 ELSE 69 --否则需要减一岁 70 BEGIN 71 --SET @age = datediff(year, @birthday,@visitdate)-1; 72 --SET @unit = '岁'; 73 SET @result=CONVERT(VARCHAR(10), datediff(year, @birthday,@visitdate)-1) + '岁'; 74 END 75 END 76 ELSE 77 --得出的岁数要-1 78 BEGIN 79 SET @age = datediff(year, @birthday,@visitdate)-1; 80 SET @unit = '岁'; 81 SET @result=CONVERT(VARCHAR(10), datediff(year, @birthday,@visitdate)-1) + '岁'; 82 END 83 END 84 --------------------------12岁以上结束------------------------------------------------- 85 --------------------------1-12岁开始------------------------------------------------- 86 87 ELSE IF(datediff(month,@birthday, @visitdate) >= 12 and datediff(month,@birthday, @visitdate) < 144) 88 BEGIN 89 --如果当前月份>=出生时的月份,取正常岁数 90 IF(DATEPART(MONTH,@visitdate) >= DATEPART(MONTH,@birthday)) 91 BEGIN 92 --如果当前日期>=出生时的日期,取正常月数 93 IF(DATEPART(DAY,@visitdate) >= DATEPART(DAY,@birthday)) 94 BEGIN 95 SET @result =CONVERT(VARCHAR(10), datediff(year, @birthday,@visitdate))+'岁'+CONVERT(VARCHAR(10),(DATEPART(MONTH,@visitdate) - DATEPART(MONTH,@birthday)))+'月'; 96 97 END 98 ELSE 99 --得出的月数-1 100 BEGIN 101 --SET @result = CONVERT(VARCHAR(10),datediff(year, @birthday,@visitdate))+'岁'+CONVERT(VARCHAR(10),datediff(month,@birthday, @visitdate)%12)+'月'; 102 SET @result = CONVERT(VARCHAR(10),datediff(year, @birthday,@visitdate))+'岁'+CONVERT(VARCHAR(10),datediff(month,@birthday, @visitdate)%12)+'月'; 103 END 104 105 END 106 ELSE 107 --得出的岁数要-1 108 BEGIN 109 --如果当前日期>=出生时的日期,取正常月数 110 IF(DATEPART(DAY,@visitdate) >= DATEPART(DAY,@birthday)) 111 BEGIN 112 --SET @result =CONVERT(VARCHAR(10), datediff(year, @birthday,@visitdate)-1)+'岁'+CONVERT(VARCHAR(10),(DATEPART(MONTH,@visitdate) - DATEPART(MONTH,@birthday)))+'月'; 113 SET @result =CONVERT(VARCHAR(10), datediff(year, @birthday,@visitdate)-1)+'岁'+CONVERT(VARCHAR(10),datediff(month,@birthday, @visitdate)%12)+'月'; 114 115 116 END 117 ELSE 118 --得出的月数-1 119 BEGIN 120 SET @result =CONVERT(VARCHAR(10), datediff(year, @birthday,@visitdate)-1)+'岁'+CONVERT(VARCHAR(10),datediff(month,@birthday, @visitdate)%12)+'月'; 121 122 END 123 END 124 END 125 --------------------------1-12岁结束------------------------------------------------- 126 127 128 129 --------------------------1个月-1岁 开始------------------------------------------------- 130 --ELSE IF(datediff(month,@birthday, @visitdate)< 12 and(( DATEPART(DAY,@visitdate) < DATEPART(DAY,@birthday) and (DATEPART(MONTH,@visitdate) -DATEPART(MONTH,@birthday))>1) or DATEPART(DAY,@visitdate) >=DATEPART(DAY,@birthday) and (DATEPART(MONTH,@visitdate) -DATEPART(MONTH,@birthday))=1)) 131 ELSE IF((datediff(month,@birthday, @visitdate)< 12) and (datediff(month,@birthday, @visitdate)> 1 or datediff(month,@birthday, @visitdate)= 1 and DATEPART(DAY,@visitdate) >= DATEPART(DAY,@birthday))) 132 BEGIN 133 ------若出生日期的月份<=当前日期的月份:不跨年,直接相减 134 --若出生日期的day=<当前日期的Day,直接是月份相减,天数相减 135 IF(DATEPART(DAY,@visitdate) >= DATEPART(DAY,@birthday)) 136 BEGIN 137 138 SET @result =CONVERT(VARCHAR(10), datediff(month, @birthday,@visitdate))+'月'+CONVERT(varchar(10),DAY(@visitdate)-DAY(@birthday))+'天'; 139 END 140 141 --若出生日期的day>当前日期的Day,直接是月份相减-1,天数(出生日期的月份天数-出生当天的天数+当前时间的天数) 142 ELSE 143 BEGIN 144 SET @result =CONVERT(VARCHAR(10), datediff(month, @birthday,@visitdate)-1)+'月'+CONVERT(VARCHAR(10), (CONVERT(VARCHAR(10),DAY(@visitdate))+DAY( DATEADD(month,1,@birthday)-DAY(@birthday))-DAY(@birthday)))+'天'; 145 END 146 147 END 148 149 150 151 152 --------------------------1个月-1岁 结束------------------------------------------------- 153 154 --------------------------1天至1月以内 开始------------------------------------------------- 155 --如果当前日期Day>出生日期的Day,并且当前日期月份-出生日期的月份=0 或者 如果当前日期Day<出生日期的Day,并且当前日期月份-出生日期的月份=1 表示一个月以内 156 IF((datediff(month,@birthday, @visitdate)=1 and DATEPART(DAY,@visitdate) < DATEPART(DAY,@birthday)) or (DATEPART(month,@visitdate) - DATEPART(month,@birthday)=0 and DATEPART(DAY,@visitdate) > DATEPART(DAY,@birthday))) 157 BEGIN 158 SET @result=CONVERT(VARCHAR(10), (datediff(MINUTE,@birthday, @visitdate))/60/24)+'天'+CONVERT(VARCHAR(10), (datediff(MINUTE,@birthday, @visitdate))/60%24)+'小时'; 159 160 END 161 --------------------------1天至1月以内 结束------------------------------------------------- 162 163 --------------------------1天以内 开始------------------------------------------------- 164 IF(datediff(HOUR,@birthday, @visitdate)< 24 ) 165 BEGIN 166 167 SET @result= CONVERT(VARCHAR(10), datediff(SECOND,@birthday, @visitdate)/60/60)+'小时'+CONVERT(VARCHAR(10), datediff(SECOND,@birthday, @visitdate)/60%60)+'分钟'; 168 END 169 --------------------------1天以内 结束------------------------------------------------- 170 171 IF (@age < 0) 172 BEGIN 173 SET @age = 0; 174 SET @unit = '岁'; 175 END 176 177 --return (CONVERT(VARCHAR(10), @age) + @unit) 178 return @result; 179 180 END
分类:
数据库
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程