欧洲所有日期格式(yyyy-mm-dd)。
我正在尝试找到每周报告的一周相应的开始日期(也就是周一开始的一周)。
set @date0 ='2012-12-31';
set @date1 ='2013-01-01';
select weekofyear(@date0), weekofyear(@date1);
> 1, 1
SQL Fidle 1 这是两个日期都在2013年的第一周。 但是,如果我尝试提取年份和年份,我会得到不同的结果(这意味着我需要找到不同的策略):
set @date0 ='2012-12-31';
select year(@date0), weekofyear(@date0);
>2012,1
set @date1 ='2013-01-01';
select year(@date1), weekofyear(@date1);
>2013,1
SQl Fidle 2 如果我手动查阅日历,我可以看到他们属于哪一年(2013年)。
这个大案例将输出周开始日期
set @date1 ='2012-01-01';
select
case when weekofyear(@date1) <> weekofyear(date_sub(@date1 , interval 1 day)) then @date1
when weekofyear(@date1) <> weekofyear(date_sub(@date1 , interval 2 day)) then date_sub(@date1 , interval 1 day)
when weekofyear(@date1) <> weekofyear(date_sub(@date1 , interval 3 day)) then date_sub(@date1 , interval 2 day)
when weekofyear(@date1) <> weekofyear(date_sub(@date1 , interval 4 day)) then date_sub(@date1 , interval 3 day)
when weekofyear(@date1) <> weekofyear(date_sub(@date1 , interval 5 day)) then date_sub(@date1 , interval 4 day)
when weekofyear(@date1) <> weekofyear(date_sub(@date1 , interval 6 day)) then date_sub(@date1 , interval 6 day)
else date_sub(@date1 , interval 6 day) end as week_start_date;
>2011-12-26
这个大案例也将产生组合年 -
set @date1 ='2012-12-31';
select
case when weekofyear(@date1) <> weekofyear(date_add(@date1 , interval 1 day)) then concat(year(@date1),'-', if(weekofyear(@date1) < 10, '0','') ,weekofyear(@date1))
when weekofyear(@date1) <> weekofyear(date_add(@date1 , interval 2 day)) then concat(year(date_add(@date1 , interval 1 day)),'-', if(weekofyear(@date1) < 10, '0','') ,weekofyear(@date1))
when weekofyear(@date1) <> weekofyear(date_add(@date1 , interval 3 day)) then concat(year(date_add(@date1 , interval 2 day)),'-', if(weekofyear(@date1) < 10, '0','') ,weekofyear(@date1))
when weekofyear(@date1) <> weekofyear(date_add(@date1 , interval 4 day)) then concat(year(date_add(@date1 , interval 3 day)),'-', if(weekofyear(@date1) < 10, '0','') ,weekofyear(@date1))
when weekofyear(@date1) <> weekofyear(date_add(@date1 , interval 5 day)) then concat(year(date_add(@date1 , interval 4 day)),'-', if(weekofyear(@date1) < 10, '0','') ,weekofyear(@date1))
when weekofyear(@date1) <> weekofyear(date_add(@date1 , interval 6 day)) then concat(year(date_add(@date1 , interval 5 day)),'-', if(weekofyear(@date1) < 10, '0','') ,weekofyear(@date1))
else concat(year(date_add(@date1 , interval 6 day)),'-', if(weekofyear(@date1) < 10, '0','') ,weekofyear(@date1)) end as week_of_year;
> 2013-01
现在,我要么找到一种更优雅的方式,要么找到一个合适的策略,将其按条件包含在组中。我想在分组的表中添加一个额外的列 - 在添加索引之后 - ,按week_of_year分组或者通过week_start_date分组。
有经验的人有更好的想法/策略吗?
注意:这将在拥有超过50万用户的数据库中使用,以分析他们执行的某项操作,并且按条件分组将采用其他参数(例如但不限于人口统计信息)。