求:员工距离下一个生日的天数

femg93 2009-04-04 09:49:57
客户要求在公告栏把三天内所有过生日的员工显示出来,该怎样提取3天内过生日的员工呢?谁有这样的原码?很急,我已经找了很久了。希望早日解决这个问题。
...全文
425 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
femg93 2009-04-05
  • 打赏
  • 举报
回复
这次很感谢大家的帮助,我想我以后也会去多看看CSDN,如果有我可以回答的问题,也会像今天的你们一样,去为他们解答。这其中尤其要感谢的是"ZZaxp"的大哥。
femg93 2009-04-05
  • 打赏
  • 举报
回复
这次很感谢大家的帮助,我想我以后也会去多看看CSDN,如果有我可以回答的问题,也会像今天的你们一样,去为他们解答。这其中尤其要感谢的是"ZZaxp"的大哥。
热学沸腾56 2009-04-05
  • 打赏
  • 举报
回复
学习了。。
femg93 2009-04-05
  • 打赏
  • 举报
回复
我感觉就是后面那个小于3的条件没起作用
femg93 2009-04-05
  • 打赏
  • 举报
回复
楼上那位你好,首先谢谢你的关注,select datediff(d,'2000-'+right(CONVERT(VARCHAR(10),生日,23),5),'2000-'+right(CONVERT(VARCHAR(10),GETDATE(),23),5))<3


我用你的这条SQL语句查出来的数据已经非常接近了。但有一点有些问题,就是如果是还没过生日的员工,就都会查询出来,不会过滤,为三日之内过生日的。真的很感谢你了,我正调试,你看能不能也帮我调一下。
yezeguo 2009-04-05
  • 打赏
  • 举报
回复
这个就直接比对就可以了啊
koukoujiayi 2009-04-05
  • 打赏
  • 举报
回复
楼主的问题有点麻烦的!!
主要是生日的3天内有跨月和跨年的问题,跨月还有个闰月的问题!!
这要写个涵数分别判断之!!
femg93 2009-04-05
  • 打赏
  • 举报
回复
知道,我这次实在被震撼了。多谢了
madelaop5566 2009-04-05
  • 打赏
  • 举报
回复
楼上的强人 膜拜你
zzxap 2009-04-05
  • 打赏
  • 举报
回复
这贴值200分
zzxap 2009-04-05
  • 打赏
  • 举报
回复
[CODE=SQL]
第一步:
计算生日和当前日期相差的年数,Birth表示生日 ,{ fn NOW() }表示当前日期
DateDiff("yyyy",Birth,{ fn NOW() })

第二步:
给生日加上刚算出来的年数就是当前年的生日
dateadd("yyyy",DateDiff("yyyy",Birth,{ fn NOW() }),Birth)

第三步:
用当前年的生日减去当天就是还剩几天过生日
DateDiff("d",dateadd("yyyy",DateDiff("yyyy",Birth,{ fn NOW() }),Birth) ,{ fn NOW() })

整体sql语句,num就是相差的天数,假设num=9

select *
from Table1
where DateDiff("d",{ fn NOW() },dateadd("yyyy",DateDiff("yyyy",Birth,{ fn NOW() }),Birth))between 0 and 3

[/CODE]
zzxap 2009-04-05
  • 打赏
  • 举报
回复
[CODE=SQL]
考虑了闰年问题。
select
name,birthdate,
case when BDCur>=today then BDCur else BDNxt end as Birthday
from
(
select name,birthdate,today,
BDCur + case when day(birthdate) =29 and day(BDCur)=28
then 1 else 0 end as BDCur,
BDNxt + case when day(birthdate)=29 and day(BDNxt)=28
then 1 else 0 end as BDNxt
from
(
select name,birthdate,today,
dateadd(year,diff,birthdate)as BDCur,
dateadd(year,diff+1,birthdate) as BDNxt
from
(
select name,birthdate,
datediff(year,birthdate,getdate()) as diff,
cast(convert(char(8),getdate(),112) as datetime) as today from your_data_table) as t1
)as t2
)as t3
假设存在某闰年2月29日生日的people,如果今年生日已过,而明年为闰年,那么查询结果birthday是?年2月29日,否则为?年3月1日。

[/CODE]
chaowenxuan 2009-04-05
  • 打赏
  • 举报
回复
fdf
zzxap 2009-04-05
  • 打赏
  • 举报
回复
[code=SQL]
SELECT *
FROM TABLE
WHERE (convert(Datetime,SUBSTRING(convert(varchar,User_birth),1,6)+'2009') BETWEEN getdate() AND (getdate()+3))

[/CODE]
zzxap 2009-04-05
  • 打赏
  • 举报
回复
[code=SQL]
TRY
select * from table where CAST( datediff(day,'2000-'+right(CONVERT(VARCHAR(10),生日,23),5),'2000-'+right(CONVERT(VARCHAR(10),GETDATE(),23),5)) AS INT)<3
TRY
select * from table where CAST( datediff(day,CONVERT(VARCHAR(10),'2000'+right(CONVERT(VARCHAR(10),生日,23),6),23),CONVERT(VARCHAR(10),'2000'+right(CONVERT(VARCHAR(10),GETDATE(),23),6) ,23)) AS INT)<3


[/CODE]
Steve 2009-04-05
  • 打赏
  • 举报
回复
faint,(年龄差)是1的都是复合条件的
Steve 2009-04-05
  • 打赏
  • 举报
回复
口误了,(年龄差)是0的都是符合条件的
Steve 2009-04-05
  • 打赏
  • 举报
回复
看一个类似的问题转换下思维,以下是比较通用的形式:
求生日在检索开始日期至检索终了日期的记录.

(检索开始日期::YYYYMMDD-生日::YYYYMMDD)/10000<>(检索终了日期::YYYYMMDD-生日::YYYYMMDD)/10000
不等式两边取整,
也就是说从生日开始计算, 到开始日期和到终了日期的天数被10000除的商(年龄差)是0的都是复合条件的.
这样可以很巧妙地绕开闰年计算.
当然检索条件的开始日期和终了日期相差不能大于1年.

对于你的问题,是上面问题的简化形式:
就是这个人0,1,2天后的年龄和今天的年龄不同,这个人就符合要求.


zzxap 2009-04-04
  • 打赏
  • 举报
回复
[code=SQL]
select * from table where datediff(day,'2000-'+right(CONVERT(VARCHAR(10),生日,23),5),'2000-'+right(CONVERT(VARCHAR(10),GETDATE(),23),5))<3

[/CODE]
femg93 2009-04-04
  • 打赏
  • 举报
回复
我正调试中.....
加载更多回复(11)

62,268

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧