获取MySQL日历周的开始日期(周年)

时间:2013-07-24 10:15:00

标签: mysql group-by database-performance query-performance

欧洲所有日期格式(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

SQL Fidle 3

这个大案例也将产生组合年 -

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

SQL Fidle 4


现在,我要么找到一种更优雅的方式,要么找到一个合适的策略,将其按条件包含在组中。我想在分组的表中添加一个额外的列 - 在添加索引之后 - ,按week_of_year分组或者通过week_start_date分组。

有经验的人有更好的想法/策略吗?

注意:这将在拥有超过50万用户的数据库中使用,以分析他们执行的某项操作,并且按条件分组将采用其他参数(例如但不限于人口统计信息)。

0 个答案:

没有答案