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