需求:收到研发侧一个需求,需要将某年按周切分,并得到每周的时间范围
并有两个要求
1、在年初与年末的时候,不能跨年
2、以星期一为一周的第一天,符合中国人习惯
比如:
2023年的第一周就只有一天 2023.01.01~2023.01.01

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

获取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;

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




