liuyong2730

2020-06-19   阅读量: 1952

Mysql

查询本周过生日的学生还有其它写法吗?我自己的思路

扫码加入数据分析学习群

       今天课上有一个练习 :查询本周过生日的同学信息。

image.png

        根据课上的思路:因为有平年和闰年,同月同日在不同年份对应的周序可能是不一样的,先要把学生的生日中的年份替换成2020(当前日期的年份),再判断它是不是在当前周开始和结束日期之间。当前周的开始和结束日期是以今天是一周中的第几天为依据计算出的,而判断今天是当前周的第几天用week()函数就能得出来了。

        计算过程和代码:

             #今天是一周中的第几天
             select date_format(curdate(),'%w');
            #本周的第一天
            select date_sub(curdate(),interval date_format(curdate(),'%w') day);
            #本周的最后一天
            select date_add(curdate(),interval 6-date_format(curdate(),'%w') day);

            整个查询写法:

            select * from stu

            where date_format(s_birth,'2020-%m-%d') between date_sub(curdate(),interval date_format(curdate(),'%w') day)

                                                                                  and date_add(curdate(),interval 6-date_format(curdate(),'%w') day);

        因为是用的一个固定的年份2020替换的学生生日中的年份,所以如果下一年再做这样的查询就要再改成2021了,老师说可以用存储过程传参,下一年再查询的话就可以调用这个存储过程。可不可以直接在代码中参数化呢?

        尝试修改了一下,把date_format(s_birth,'2020-%m-%d')用 函数date(concat(year(curdate()),date_format(stu.s_birth,'%m%d')))代替,这样应该可以的吧。

            select * from stu
            where date(concat(year(curdate()),date_format(stu.s_birth,'%m%d'))) between date_sub(curdate(),interval date_format(curdate(),'%w') day)
                                                                                                                           and date_add(curdate(),interval 6-date_format(curdate(),'%w') day);

         另外,我觉得还可以用另外一种思路。即判断周序的方法。虽然一开始说因为有平年和闰年,同月同日在不同年份对应的周序可能是不一样。但是生日只是判断月份和天数,所以也是可以像上面那种做法一样,把学生生日中的年份替换成当前日期的年份,这样week()函数在计算的时候都是参考的一样的年份了,就不存在年份不同导致的问题了。

        select * from stu
        where week(concat(year(curdate()),date_format(stu.s_birth,'%m%d'))) = week(curdate());

       不知道这样可以不?大神们指点下吧。

添加CDA认证专家【维克多阿涛】,微信号:【cdashijiazhuang】,提供数据分析指导及CDA考试秘籍。已助千人通过CDA数字化人才认证。欢迎交流,共同成长!
26.0292 2 2 关注作者 收藏

评论(0)


暂无数据

推荐课程