生日提醒之农历,公历问题2

上一篇 生日提醒之农历,公历问题 配置了基础数据和函数,本篇介绍如何运用

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

为了正确提醒生日,所以在输入生日时,应该确定用户是公历生日还是农历生日,通过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

此处是获取3内之内将过生日的人数。

 

注意点:1.有人是农历过生日,有人是公历过生日,所以分开处理

            2.为了准确计算相差日期,用到函数DATEDIFF,所以要用公历来计算

            3.注意一年过两个生日的情况

 

流程:

1.查询公历过生日情况

    直接用DATEDIFF函数计算会员生日与指定日期的时间差,如果在规定提醒区间,则提醒。这个比较简单

2.查询农历过生日情况

    2.1 先把指定日期转换为农历,一般是系统日期

    2.2 获取指定日期在农历属于哪一年

    2.3 将会员生日转换到指定日期农历年的日期,即为会员某一农历年的生日

    2.4 计算出指定日期农历年的生日后,再将其转换成对应的公历

    2.5 比照农历生日转换成公历生日与指定日期的时间差在不在规定的提醒敬意,同样用DATEDIFF函数。

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/s021368/articles/1853378.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值