私たちの開発プロセスでは、今月、今週、または当日に従ってメンバーやマーチャントをランク付けすることがよくあります。もちろん、最初に使用されたデータを取得し、その後関数に従ってデータを処理することもできます。次に、MySQL を直接操作し、MySQL のいくつかの統計関数を使用してデータを便利にフィルタリングする方法を紹介します。
まず最初に、php を使用して、今日、今週、今月、昨日のタイムスタンプを取得する方法を紹介します。
-
今日の開始タイムスタンプと終了タイムスタンプを取得します
$today_start=mktime(0,0,0,date('m'),date('d'),date('Y')); $today_end=mktime(0,0,0,date('m'),date('d')+1,date('Y'))-1;
-
昨日の開始タイムスタンプと終了タイムスタンプを取得します
$yesterday_start=mktime(0,0,0,date('m'),date('d')-1,date('Y')); $yesterday_end=mktime(0,0,0,date('m'),date('d'),date('Y'))-1;
-
先週の開始タイムスタンプと終了タイムスタンプを取得します
$lastweek_start=mktime(0,0,0,date('m'),date('d')-date('w')+1-7,date('Y')); $lastweek_end=mktime(23,59,59,date('m'),date('d')-date('w')+7-7,date('Y'));
-
今週の開始と終了のタイムスタンプを取得します
$thisweek_start=mktime(0,0,0,date('m'),date('d')-date('w')+1,date('Y')); $thisweek_end=mktime(23,59,59,date('m'),date('d')-date('w')+7,date('Y'));
-
今月の開始タイムスタンプと終了タイムスタンプを取得します
$thismonth_start=mktime(0,0,0,date('m'),1,date('Y')); $thismonth_end=mktime(23,59,59,date('m'),date('t'),date('Y'));
以下は、MySQL が日、週、月のデータを取得するための基本的な操作の一部です。
-
その日のデータをクエリする
SELECT * FROM テーブル名 WHERE TO_DAYS(時間フィールド)=TO_DAYS(NOW());
-
昨日のデータをクエリする
SELECT * FROM テーブル名 WHERE TO_DAYS(NOW())-TO_DAYS(時間フィールド)=1;
-
今週のデータをクエリする
SELECT * FROM テーブル名 WHERE YEARWEEK(DATE_FORMAT(時間フィールド,'%Y-%m-%d'))=YEARWEEK(NOW());
-
先週のデータをクエリする
SELECT * FROM テーブル名 WHERE YEARWEEK(DATE_FORMAT(時間フィールド,'%Y-%m-%d'))=YEARWEEK(NOW())-1;
-
当月のデータをクエリする
SELECT * FROM テーブル名 WHERE DATE_FORMAT(時間フィールド,'%Y%m')=DATE_FORMAT(CURDATE(),'%Y%m');
-
前月のデータをクエリする
SELECT * FROM テーブル名 WHERE PERIOD_DIFF(DATE_FORMAT(NOW(),'%Y%m'),DATE_FORMAT(時間フィールド,'%Y%m'))=1;
-
その年のデータをクエリする
SELECT * FROM テーブル名 WHERE YEAR(時刻フィールド) =YEAR(NOW());
-
過去 7 日間のデータをクエリする
SELECT * FROM テーブル名 WHERE DATE_SUB(CURDATE(),INTERVAL 7 DAY)<=DATE(時刻フィールド);
次に、上記のクエリ操作の一部を使用して、以下の図に示す収入ランキング関数のデータを処理します。
-
データ形式は上の図に示されており、コードは以下に直接リストされています。
switch ($style) { case 'total'://总トレンド // $total = M('income_log')->group('userid')->sum($field); $total = M('')->query("SELECT userid,SUM($field) as sum FROM収入_log GROUP BY userid ORDER BY SUM($field) DESC LIMIT 10"); 壊す; case 'day'://日トレンド $total = M('')->query("SELECT userid,SUM($field) as sum FROMcome_log where TO_DAYS(date)=TO_DAYS(NOW()) GROUP BY userid ORDER BY SUM($field) DESC LIMIT 10"); 壊す; case 'week'://周トレンド $total = M('')->query("SELECT userid,SUM($field) as sum FROM収入_log where YEARWEEK(DATE_FORMAT(date, $total = M('')->query("SELECT userid,SUM($field) as sum FROMcome_log where DATE_FORMAT(date,'%Y%m')=DATE_FORMAT(CURDATE(),'%Y%m' ) GROUP BY userid ORDER BY SUM($field) DESC LIMIT 10"); 壊す; デフォルト: ブレーク; }
以下は、処理のみが必要な取得データの結果です。ここでは、ユーザー情報の取得とランキングを容易にするために、group by を使用してデータをユーザー ID ごとにグループ化しています。
Array ( [0] => Array ( [userid] => 2 [sum] => 6.00 ) [1] => Array ( [userid] => 1 [sum] => 6.00 ) [2] => Array ( [ユーザー ID] => 3 [合計] => 1.00 ) [3] => 配列 ( [ユーザー ID] => 4 [合計] => 0.20 ) )
再版: PHP+MySQL は今月、今週、当日のデータをカウントし、対応するフィールドをグループにソートします
MySQL の週 (WEEK、YEARWEEK)
MySQL の週 (WEEK、YEARWEEK) - Dandelion Cloud
mysql ではデフォルトで 1 週間は日曜日から月曜日までであり、これは海外の習慣と同じですが、中国では 1 週間は月曜日から日曜日までとカウントされます。したがって、「今週のデータ」などを集計する場合には特に注意が必要です。
この点に対処するために、インターネット上の多くの記事を見てコードを書きましたが、実際、mysql が提供する WEEK および YEARWEEK 関数ではこの点が考慮されています。
WEEK関数の紹介
通常、通常の年は 365 日あり、閏年は 366 日あります。1 年は多くの週に分割でき、各週は 7 日になります。したがって、1 年は 365/7 = 52 週になることが多く、週の範囲は 1 から 52 になります。
特定の日付がどの週番号に属するかを確認するには、次のように WEEK 関数を使用します。
WEEK(日付、モード);
WEEK 関数は 2 つのパラメータを受け入れます。
- date は週番号を取得する日付です。
- mode は、週番号計算のロジックを決定するオプションのパラメーターです。これにより、週が月曜日から始まるか日曜日から始まるかを指定でき、返される週番号は 0 ~ 52 または 0 ~ 53 である必要があります。
mode パラメータを省略した場合、デフォルトで WEEK 関数は、default_week_format システム変数の値を使用します。
default_week_format 変数の現在の値を取得するには、次のように SHOW VARIABLES ステートメントを使用します。
- mysql> 'default_week_format' のような変数を表示します。
- +——————————-+————-+
- | 変数名 | 値 |
- +——————————-+————-+
- | デフォルトの週の形式 | 0 |
- +——————————-+————-+
- セット内の 1 行
私たちのサーバーでは、default_week_format のデフォルト値は 0 です。次の表は、mode パラメーターが WEEK 関数にどのような影響を与えるかを示しています。
モデル |
週の最初の日 |
範囲 |
0 |
日曜日 |
0-53 |
1 |
月曜日 |
0-53 |
2 |
日曜日 |
1-53 |
3 |
月曜日 |
1-53 |
4 |
日曜日 |
0-53 |
5 |
月曜日 |
0-53 |
6 |
日曜日 |
1-53 |
7 |
月曜日 |
1-53 |
上の表の「今年は 4 日以上ある」ということは、次のことを意味します。
- 週に 1 月 1 日が含まれ、新年に 4 日以上ある場合、その週はその年の第 1 週になります。
- それ以外の場合、今週の番号は前年の最終週となり、次の週はその年の最初の週になります。
したがって、年を考慮する必要がある場合は、YEARWEEK 関数を使用する方が適切です。
例
中国の習慣に従って、月曜日を週の最初の日として数え、WEEK 関数と YEARWEEK 関数を使用して 2019-07-11 の週を取得します。
select WEEK('2019-07-11',1);
戻り値は28です
select YEARWEEK('2019-07-11',1);
戻り値は201928です