暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL实现某年按周切分

原创 aisql 2024-01-09
103
需求:收到研发侧一个需求,需要将某年按周切分,并得到每周的时间范围

并有两个要求
1、在年初与年末的时候,不能跨年
2、以星期一为一周的第一天,符合中国人习惯

比如:image.png
2023年的第一周就只有一天 2023.01.01~2023.01.01
image.png
2024年的最后一周,就只有 2024.12.30~2024.12.31两天

实现 先定义一个自定义函数 实现指定日期属于第几周,并给出这周的范围
delimiter // CREATE FUNCTION get_week_range(datestr date) returns json DETERMINISTIC begin declare weeofyear int; declare date_begin1,date_begin2,date_end date; set weeofyear = week(datestr, 5); set weeofyear = if(week(concat(year(datestr),'-01-01'),5) =0 ,weeofyear + 1,weeofyear); set date_begin1 = date_add(concat(year(datestr),'-01-01'),interval (weeofyear-1)*7 -weekday(concat(year(datestr),'-01-01')) day); set date_begin2 = if(date_begin1 < concat(year(datestr),'-01-01'),concat(year(datestr),'-01-01'),date_begin1); set date_end= if(date_add(date_begin1, interval 6 day) > concat(year(datestr),'-12-31'),concat(year(datestr),'-12-31'),date_add(date_begin1, interval 6 day)) ; return JSON_OBJECT("week",weeofyear,"date_begin",date_begin2,"date_end",date_end); end // delimiter ;

测试一下这个函数

select JSON_EXTRACT(get_week_range(now()),'$.week') as weekofyear,JSON_EXTRACT(get_week_range(now()),'$.date_begin') as date_begin ,JSON_EXTRACT(get_week_range(now()),'$.date_end') as date_end

image.png

获取2024年所有周及时间范围

with recursive cte as ( select '2024-01-01' as date_day union all select date_add(date_day ,interval 1 day) from cte where date_day <'2024-12-31' ) select distinct JSON_EXTRACT(get_week_range(date_day),'$.week') as weekofyear,JSON_EXTRACT(get_week_range(date_day),'$.date_begin') as date_begin ,JSON_EXTRACT(get_week_range(date_day),'$.date_end') as date_end from cte;

image.png

如果你有更简单的方法,可以评论区给出。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论