ISO 통계에 의한 52주 복제 코드


'52주 전'이 몇 월 며칠이죠?


1년의 숫자 변화를 추적하기 위해 12개월이면 너무 긴장하고 365일이면 너무 톱질한다.
따라서'주 단위'라면 요일의 영향도 사라지고 순조롭다.
52개의 수치의 변화를 도표로 만들 때 보기에 딱 좋다.
그래서 52주 동안 통계를 내고 싶어요.
  • 월요일부터?일요일부터?
  • 52주 전 월요일은 며칠입니까?
  • 어떻게 계산합니까?
  • 그런 일은 더 이상 고민할 필요가 없다.위대한 사람들이 고려할 때'국제 규격'으로 정리되어 각종 프로그래밍 언어도 표준적으로 사용할 수 있다.
    이 글은 국제 표준에 부합되는 코드를 총결하여 PHP+MySQL+Laravel 환경에서 복제에서 사용할 수 있다.

    ISO-8601 기반 주 번호


    원래 익숙하지 않지만 1년을 52주로 나누어 1월부터 번호를 매기는 것을'주번호'라고 부른다고 한다.
    그 주 번호는 계수 방법이 많지만 많으면 귀찮아서 ISO가 정해줬어요.
    ISO_8601# 년, 주 및 주 (wikipedia)
    단도직입적이다
  • 월요일부터
  • 1월 4일 포함 주 1주(1주 포함 4일 이상)
  • 이것을 MySQL, PHP, Laravel로 어떻게 처리하는지...

    MySQL


    MySQL YEARWEEK() Function
    YEARWEEK 함수의 모드 3.
    3 - First day of week is Monday and the first week has more than 3 days
    한마디로 ISO-8601입니다.
    그렇습니다.
    SELECT YEARWEEK( created_at, 3 ) AS week
    

    PHP


    날짜에 W를 입력하면 주 번호입니다. (W를 직접 출력하려면\W로 바꿔야 합니다.)
    strtotime에서 연호와 주호는 W'yyyyWww'의 형식으로 제시된다.예를 들어 '2018W35'
    date('Y/m/d'); // 今日が 2018/08/29 だとすると…
    
    date('Y\WW',strtotime("-0 weeks")); // 2018W35(1つ目のWはエスケープしてそのまま出力)
    date('Y/m/d D',strtotime("2018W35"));  // 2018/08/27 Mon
    
    date('Y\WW',strtotime("-52 weeks")); // 2017W35
    date('Y/m/d D',strtotime("2017W35"));  // 2017/08/28 Mon
    
    -0weeks는 오늘을 포함한 일주일, 아직 7일이 지나지 않았습니다.
    보통 합계 대상에서 제외하고, 합계 기간은 52주~1주를 대상으로 한다.

    Laravel


    만약 My Orders List라는 Eloquent 모델이 있다면...
    // 集計したい週数
    $weeks = 52; 
    // 開始日時をタイムスタンプにしておく
    $start_time = strtotime(date('Y\WW',strtotime("-{$weeks} weeks")));
    
    $result = MyOrdersList::select(
        DB::raw('YEARWEEK(created_at,3) AS week'), 
        DB::raw('sum(*) AS price')
    )->whereRaw("created_at >= '".date('Y-m-d 00:00:00',$start_time)."'")
    ->groupBy('week')
    ->pluck('price','week')
    ->toArray();
    
    // 歯抜けなしデータにしながらキーをY-m-d形式に
    $filled_result = [];
    for( $i=$weeks; $i>=1; $i-- ){
        $week = date('YW',strtotime("-$i weeks"));
        $date = date('Y-m-d',strtotime("-$i weeks"));
        $filled_result[$date] = isset($result[$week]) ? $result[$week] : 0;
    }
    return $filled_result;
    
    return
    => [
         "2017-08-30" => 351,
         "2017-09-06" => 0,
         "2017-09-13" => 524,
         "2017-09-20" => 434,
    
         ......
    
         "2018-08-01" => 144,
         "2018-08-08" => 264,
         "2018-08-15" => 0,
         "2018-08-22" => 491,
       ]
    

    감상


    또 누가 기사를...한 명의 사용자(자기 포함)만 있으면 된다.
    저는 개인적으로 일주일부터 월요일 파티입니다. 달력은 일요일부터 많지 않습니까?(아이폰의 달력 앱도 일요일부터 시작된다. 언어와 지역 설정에 따라) 내가 달력을 전혀 넘기지 않는 이유가 틀림없다.

    좋은 웹페이지 즐겨찾기