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

 

posted on 2022-07-21 14:16  ListentoYourHeart  阅读(226)  评论(0编辑  收藏  举报