ISO 통계에 의한 52주 복제 코드
'52주 전'이 몇 월 며칠이죠?
1년의 숫자 변화를 추적하기 위해 12개월이면 너무 긴장하고 365일이면 너무 톱질한다.
따라서'주 단위'라면 요일의 영향도 사라지고 순조롭다.
52개의 수치의 변화를 도표로 만들 때 보기에 딱 좋다.
그래서 52주 동안 통계를 내고 싶어요.
이 글은 국제 표준에 부합되는 코드를 총결하여 PHP+MySQL+Laravel 환경에서 복제에서 사용할 수 있다.
ISO-8601 기반 주 번호
원래 익숙하지 않지만 1년을 52주로 나누어 1월부터 번호를 매기는 것을'주번호'라고 부른다고 한다.
그 주 번호는 계수 방법이 많지만 많으면 귀찮아서 ISO가 정해줬어요.
ISO_8601# 년, 주 및 주 (wikipedia)
단도직입적이다
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,
]
감상
또 누가 기사를...한 명의 사용자(자기 포함)만 있으면 된다.
저는 개인적으로 일주일부터 월요일 파티입니다. 달력은 일요일부터 많지 않습니까?(아이폰의 달력 앱도 일요일부터 시작된다. 언어와 지역 설정에 따라) 내가 달력을 전혀 넘기지 않는 이유가 틀림없다.
Reference
이 문제에 관하여(ISO 통계에 의한 52주 복제 코드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kd9951/items/438132f39739fc4fa5e7
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
SELECT YEARWEEK( created_at, 3 ) AS week
날짜에 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,
]
감상
또 누가 기사를...한 명의 사용자(자기 포함)만 있으면 된다.
저는 개인적으로 일주일부터 월요일 파티입니다. 달력은 일요일부터 많지 않습니까?(아이폰의 달력 앱도 일요일부터 시작된다. 언어와 지역 설정에 따라) 내가 달력을 전혀 넘기지 않는 이유가 틀림없다.
Reference
이 문제에 관하여(ISO 통계에 의한 52주 복제 코드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kd9951/items/438132f39739fc4fa5e7
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
// 集計したい週数
$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;
=> [
"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,
]
또 누가 기사를...한 명의 사용자(자기 포함)만 있으면 된다.
저는 개인적으로 일주일부터 월요일 파티입니다. 달력은 일요일부터 많지 않습니까?(아이폰의 달력 앱도 일요일부터 시작된다. 언어와 지역 설정에 따라) 내가 달력을 전혀 넘기지 않는 이유가 틀림없다.
Reference
이 문제에 관하여(ISO 통계에 의한 52주 복제 코드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kd9951/items/438132f39739fc4fa5e7텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)