上一篇 生日提醒之农历,公历问题 配置了基础数据和函数,本篇介绍如何运用
1.创建应用表
用户表
1
CREATE
TABLE
[
users
]
(
2 [ us_id ] [ int ] IDENTITY ( 1 , 1 ) NOT NULL ,
3 [ us_username ] [ nvarchar ] ( 40 ) NOT NULL ,
4 [ us_password ] [ nvarchar ] ( 64 ) NOT NULL ,
5 [ us_firstname ] [ nvarchar ] ( 60 ) NULL ,
6 [ us_lastname ] [ nvarchar ] ( 60 ) NULL ,
7 [ us_birthday ] [ datetime ] NULL ,
8 [ us_islunar ] [ bit ] NULL ,
9 CONSTRAINT [ pk_users ] PRIMARY KEY CLUSTERED
10 (
11 [ us_id ] ASC
12 ) WITH (PAD_INDEX = OFF , STATISTICS_NORECOMPUTE = OFF , IGNORE_DUP_KEY = OFF , ALLOW_ROW_LOCKS = ON , ALLOW_PAGE_LOCKS = ON ) ON [ PRIMARY ]
13 ) ON [ PRIMARY ]
14
15 GO
16
17 ALTER TABLE [ dbo ] . [ users ] ADD CONSTRAINT [ DF_users_us_islunar ] DEFAULT (( 0 )) FOR [ us_islunar ]
18 GO
2 [ us_id ] [ int ] IDENTITY ( 1 , 1 ) NOT NULL ,
3 [ us_username ] [ nvarchar ] ( 40 ) NOT NULL ,
4 [ us_password ] [ nvarchar ] ( 64 ) NOT NULL ,
5 [ us_firstname ] [ nvarchar ] ( 60 ) NULL ,
6 [ us_lastname ] [ nvarchar ] ( 60 ) NULL ,
7 [ us_birthday ] [ datetime ] NULL ,
8 [ us_islunar ] [ bit ] NULL ,
9 CONSTRAINT [ pk_users ] PRIMARY KEY CLUSTERED
10 (
11 [ us_id ] ASC
12 ) WITH (PAD_INDEX = OFF , STATISTICS_NORECOMPUTE = OFF , IGNORE_DUP_KEY = OFF , ALLOW_ROW_LOCKS = ON , ALLOW_PAGE_LOCKS = ON ) ON [ PRIMARY ]
13 ) ON [ PRIMARY ]
14
15 GO
16
17 ALTER TABLE [ dbo ] . [ users ] ADD CONSTRAINT [ DF_users_us_islunar ] DEFAULT (( 0 )) FOR [ us_islunar ]
18 GO
为了正确提醒生日,所以在输入生日时,应该确定用户是公历生日还是农历生日,通过us_islunar来标记。
1表示是农历,0表示公历
2.获取将过生日的人
生日提醒
1
DECLARE
@d
DATETIME
2 SET @d = ' 2010-12-25 '
3 SELECT *
4 FROM
5 ( SELECT u.us_id,u.us_username,u.us_birthday
6 , ISNULL ( DATEDIFF ( DAY , @d ,dbo.fn_GetSolar( LEFT (dbo.fn_GetLunar( @d ), 4 ) +RIGHT ( CONVERT ( CHAR ( 10 ),u.us_birthday, 23 ), 6 ))), - 1 ) CountDay
7 FROM users u
8 WHERE U.us_islunar = 1
9 UNION ALL
10 SELECT u.us_id,u.us_username,u.us_birthday
11 , DATEDIFF ( DAY , @d , DATEADD ( YEAR , DATEDIFF ( YEAR ,u.us_birthday, @d ), u.us_birthday))
12 FROM users u
13 WHERE U.us_islunar = 0
14 ) A
15 WHERE a.CountDay >= 0 AND a.CountDay <= 3
16
2 SET @d = ' 2010-12-25 '
3 SELECT *
4 FROM
5 ( SELECT u.us_id,u.us_username,u.us_birthday
6 , ISNULL ( DATEDIFF ( DAY , @d ,dbo.fn_GetSolar( LEFT (dbo.fn_GetLunar( @d ), 4 ) +RIGHT ( CONVERT ( CHAR ( 10 ),u.us_birthday, 23 ), 6 ))), - 1 ) CountDay
7 FROM users u
8 WHERE U.us_islunar = 1
9 UNION ALL
10 SELECT u.us_id,u.us_username,u.us_birthday
11 , DATEDIFF ( DAY , @d , DATEADD ( YEAR , DATEDIFF ( YEAR ,u.us_birthday, @d ), u.us_birthday))
12 FROM users u
13 WHERE U.us_islunar = 0
14 ) A
15 WHERE a.CountDay >= 0 AND a.CountDay <= 3
16
此处是获取3内之内将过生日的人数。
注意点:1.有人是农历过生日,有人是公历过生日,所以分开处理
2.为了准确计算相差日期,用到函数DATEDIFF,所以要用公历来计算
3.注意一年过两个生日的情况
流程:
1.查询公历过生日情况
直接用DATEDIFF函数计算会员生日与指定日期的时间差,如果在规定提醒区间,则提醒。这个比较简单
2.查询农历过生日情况
2.1 先把指定日期转换为农历,一般是系统日期
2.2 获取指定日期在农历属于哪一年
2.3 将会员生日转换到指定日期农历年的日期,即为会员某一农历年的生日
2.4 计算出指定日期农历年的生日后,再将其转换成对应的公历
2.5 比照农历生日转换成公历生日与指定日期的时间差在不在规定的提醒敬意,同样用DATEDIFF函数。