Skip to content

mysql当周过生日的人_已知出生年月日,如何查询出本周过生日的人员?

最近偶然发现这位朋友 @carolinezhq 分享的sql练习题carolinezhq:【SQL】SQL面试50题 分类梳理与解答​zhuanlan.zhihu.com5d4f79ce0c776282ec59f0e78ea69eb0.png

其中最后的52题比较有意思(写出52题,那53题就不成问题了),题目大意是:从学生信息表(student)中通过出生日期字段(sage)查询出本周过生日的同学。相关表如下图:

这个题目对于我这个mysql新手来说还是比较棘手的,百度一翻之后发现很多答案要么是错的,要么写得我一脸懵逼,最后决定还是自己动手丰衣足食。

解题大体思路:判断生日日期与当前日期是否为本年度相同周数

两个注意点(也是难点):1.同周跨年(即上一年的12月31号与下一年的1月1号在同一个星期),2.特殊的2月29号生日(对于这一点我假定在非闰年时,这类同学是在3月1号过生日)

我的方法是先创建函数对特殊情况进行分类讨论,全部语句如下:

delimiter //

create function birthday(sage date)

returns boolean NOT DETERMINISTIC NO SQL

begin

declare date_now date;

declare bool boolean;

set date_now = curdate();

if month(sage)=12 and month(date_now)=1 then

if week(replace(sage, year(sage), year(date_now)-1), 7) = week(date_now,7) then

set bool = 1;

else

set bool = 0;

end if;

elseif month(date_now)=12 and month(sage)=1 then

if week(replace(sage, year(sage), year(date_now)+1), 7) = week(date_now,7) then

set bool = 1;

else

set bool = 0;

end if;

elseif month(sage)=2 and day(sage)=29 then

if year(date_now)%4=0 then

if week(replace(sage, year(sage), year(date_now)),7) = week(date_now,7) then

set bool = 1;

else

set bool = 0;

end if;

else

if week(concat_ws('-',year(curdate()),'03','01'),7) = week(date_now,7) then

set bool = 1;

else

set bool = 0;

end if;

end if;

else

if week(replace(sage, year(sage), year(date_now)),7) = week(date_now,7) then

set bool = 1;

else

set bool = 0;

end if;

end if;

return bool;

end//

delimiter ;

select sno, sname, sage, ssex

from (select *, birthday(sage) as bool from student) as a

where a.bool = 1;

如果要查询下周过生日的学生,可以在获取的当前日期上再加7天。

set date_now = date_add(curdate(), interval 1 week);

补充20题的答案:

--20. 查询和" 01 "号同学学习的课程完全相同的其他同学的信息

--筛选出和01号同学有相同课程数量的其他同学及课程数

create view cno_frequency as

select sno, count(cno) as cno_num from sc

where sno <> '01'

group by sno

having count(cno) = (select count(cno) from sc where sno='01');

--统计其他同学和01号同学相同课程的课程数

create view sno_frequency as

select sno, count(cno) as sno_num from sc

where cno in (select cno from sc where sno = '01')

and sno <> '01'

group by sno;

select * from student

where sno in (select s.sno

from sno_frequency as s left outer join cno_frequency as c

on s.sno = c.sno

where s.sno_num =c.cno_num);


版权声明:本文为weixin_39753260原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。

聚圣源btv6小孩可以起什么名字蓝墨云班课香港ip代理月朗风清猪蹄加盟店新世纪福音战士国语版相公个个太腹黑三个字有品牌起名密室3如何起名字的古书籍起名周易法老鼠出生起名大全家乡的春节meishichina江汉路有名的婚纱摄影男孩起名打分黑道学生病魔缠身迅捷影视苹果官网序列号查询胡太太2061次列车免漆家具钰字在起名中的意义姓付女孩起名甜美武汉市地图全图起名周易宝典男宝姓刘起什么名字姓牛宝宝起名姓牛宝宝起名姓名起名软件淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化