博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用于生日计算的参数
阅读量:4709 次
发布时间:2019-06-10

本文共 1614 字,大约阅读时间需要 5 分钟。

 

今天在看资料,讲的是根据一个人的出生日期和今天的日期来计算他最近的生日。这个问题在一定程度上演示了如何通过使用datetime函数正确处理闰年。

下面我会建一张测试表,来说明问题

1 create table testTB2 (3 ID int primary key identity (1,1),4 name varchar(20),5 birthday datetime6 )

然后插入几条数据

INSERT INTO TESTTB VALUES('yj','1990-08-20')INSERT INTO TESTTB VALUES('cyf','1990-05-20')INSERT INTO TESTTB VALUES('wzm','1990-12-20')INSERT INTO TESTTB VALUES('gzs','1990-12-31')INSERT INTO TESTTB VALUES('XXx','1972-2-29')INSERT INTO TESTTB VALUES('ww',cast(convert(char(8),getdate(),112) as datetime))

 

好,上面就是我现在表里面的数据。

我想要的是每个人离今天最近的生日,如果今年的生日已经过了,则返回明年的生日,否则,返回今年的生日

 

ok

1 with Args1 as ( 2 SELECT name,birthday,datediff(year,birthday,getdate()) as diff, 3 cast(convert(char(8),getdate(),112) as datetime)as today from testTB 4 ), 5 Args2 as 6 ( 7 select name,birthday,today,dateadd(year,diff,birthday) as bdcur, 8                    dateadd(year,diff+1,birthday) as bdnxt from Args1 9 ),10 Args3 as11 (12 select name,birthday,today,bdcur+ case when day(birthday)=29 and day(bdcur)=28 then  1 else 0 end as bdcur,13                            bdnxt+case when day(birthday)=29 and day(bdnxt)=28 then 1 else 0 end as bdnxt from Args214 )15 select name,birthday,case when bdcur>=today then bdcur else bdnxt end as birth from Args3

 

OK

最后结果是这样的

 Args1用于计算每个人的出生日期与今天相差的年数(diff),今天午夜的日期(today),要计算某人最近的生日,需要把birthday加上diff列的年数,如果结果遭遇今天,需要再加一年。

Args2比Args1增加了bdcur和bdnxt两列,这2列分别用于保存今年和明年的生日。

ps:如果出生日期是2月29,而目标日期(bdcur或bdnxt)不是在闰年,这2列所包含的将是2月28,而不是3月1,Args3根据需要把bdcur和bdnxt的日期调整为3月1,。

如果bdcur大于或者等于今天的日期,外部查询返回bdnxt作为最近的生日,否则就返回bdnxt。

你可以看到最后2条特殊数据有所改变

 

转载于:https://www.cnblogs.com/yjShow/archive/2012/12/19/2825113.html

你可能感兴趣的文章
jenkins配置构建执行状态
查看>>
Git克隆与更新代码
查看>>
ABP开发框架前后端开发系列---(15)ABP框架的服务端和客户端缓存的使用
查看>>
免密登录
查看>>
jjs 产生undefined的情况
查看>>
拼图数字游戏
查看>>
PHP 开发 APP 接口 学习笔记与总结 - APP 接口实例 [4] 首页 APP 接口开发方案 ③ 定时读取缓存方式...
查看>>
xml
查看>>
python上下文管理器
查看>>
总结了一些MySQL优化方面的技巧
查看>>
Sql server 将表2中数据更新到表1中
查看>>
ASP.NET_SessionId vs .ASPXAUTH why do we need both of them?
查看>>
Chrome查看JavaScript函数
查看>>
xunit输出output到控制台
查看>>
The OAuth 2.0 Authorization Framework: Bearer Token Usage
查看>>
IIS访问站点,出现connection refused
查看>>
笔记:Android触摸事件传递机制
查看>>
mvc与ssm
查看>>
Java小知识---Java请求一个URL。获取网站返回的数据
查看>>
更改docker服务网段分配地址
查看>>