0

すべての日付形式はヨーロッパ (yyyy-mm-dd) です。

weekofyear (これは、月曜日から始まる週) によって報告された週の対応する開始日を見つけようとしています。

set @date0 ='2012-12-31';
set @date1 ='2013-01-01';
select weekofyear(@date0), weekofyear(@date1);
> 1, 1

SQL Fiddle 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 フィドル 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 フィドル 4


今、私はそれを行うためのよりエレガントな方法を見つけるか、これを条件によってグループに含めるための適切な戦略を見つける必要があります。グループ化されているテーブルに余分な列を追加し、インデックスを追加した後、week_of_yearまたはweek_start_dateでグループ化することを考えていました。

経験豊富な誰かがより良いアイデア/戦略を持っていますか?

注: これは、ユーザーが実行する特定のアクションを分析するために、50 万人を超えるユーザーがいるデータベースで使用されます。条件によるグループ化は、他のパラメーター (人口統計など) を取ります。

4

0 に答える 0