MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLでDATE型の列から月の第N週を取得する方法

MySQLのDATE型カラムから月の第N週(N番目の平日)を取得する

日付データから「その月の何週目にあたるか」を求めたいケースはよくあります。例えば、1日〜7日なら第1週、8日〜14日なら第2週、15日〜21日なら第3週、22日〜28日なら第4週、29日以降なら第5週といった具合です。

MySQLでは、DAY()関数を使えば日付から「日」の部分を取り出せます。さらに、CASE文と組み合わせることで、その日が月の第何週に該当するかを簡単に判定できます。

それでは、実際の例を見ていきましょう。まずサンプル用のテーブルを作成します。

mysql> create table DemoTable
(
    AdmissionDate date
);
Query OK, 0 rows affected (0.63 sec)

次に、INSERTコマンドでいくつかのレコードを挿入します。

mysql> insert into DemoTable values('2019-09-12');
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable values('2019-09-06');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values('2019-09-26');
Query OK, 1 row affected (0.22 sec)
mysql> insert into DemoTable values('2019-09-30');
Query OK, 1 row affected (0.14 sec)

SELECT文ですべてのレコードを表示して確認しましょう。

mysql> select *from DemoTable;

実行結果は以下の通りです。

+---------------+
| AdmissionDate |
+---------------+
| 2019-09-12    |
| 2019-09-06    |
| 2019-09-26    |
| 2019-09-30    |
+---------------+
4 rows in set (0.00 sec)

月の第N週を取得するクエリ

以下が、日付がその月の第何週にあたるかを取得するクエリです。DAY()関数で日の値を取得し、CASE文で範囲ごとに週番号を振り分けています。

mysql> select
(
   CASE WHEN DAY(AdmissionDate) BETWEEN 1 AND 7 THEN 1
        WHEN DAY(AdmissionDate) BETWEEN 8 AND 14 THEN 2
        WHEN DAY(AdmissionDate) BETWEEN 15 AND 21 THEN 3
        WHEN DAY(AdmissionDate) BETWEEN 22 AND 28 THEN 4
   else 5
      end
) as NthWeekDayOfMonth
from DemoTable;

実行すると、以下のような結果が出力されます。

+-------------------+
| NthWeekDayOfMonth |
+-------------------+
|                 2 |
|                 1 |
|                 4 |
|                 5 |
+-------------------+
4 rows in set (0.01 sec)

結果の解説

  • 2019-09-12 → 12日は8日〜14日の範囲なので第2週
  • 2019-09-06 → 6日は1日〜7日の範囲なので第1週
  • 2019-09-26 → 26日は22日〜28日の範囲なので第4週
  • 2019-09-30 → 30日は29日以降なので第5週

このように、DAY()関数とCASE文を組み合わせるだけで、曜日に関係なく「月の中での週番号」を柔軟に算出できます。月末が31日になる月でも、else句で処理されるため対応可能です。勤怠管理やスケジュール集計など、週単位でデータをグルーピングしたい場合にぜひ活用してください。

  1. MySQLでGROUP BYとMIN()を使い、重複する値を持つ列ごとにタイムスタンプから最初の日付を取得する方法

    このようなケースでは、集計関数 MIN() と GROUP BY 句を組み合わせることで簡単に実現できます。まずはサンプル用のテーブルを作成しましょう。mysql> create table DemoTable1870 ( Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, Value int, ShippingTimestamp varchar(100) ); Query OK, 0 rows affected (0.00 sec)次に、INSERTコマンドを使ってテーブルにレコードを挿入します。ここでは、同じ

  2. MySQLでテーブルの日付レコードを変更する方法|UPDATEとDATE_ADD()の使い方

    MySQLで保存済みの日付データに年数を加算して変更したい場合、UPDATEコマンドとDATE_ADD()関数を組み合わせることで簡単に実現できます。ここでは、実際のSQLクエリ例を使いながら、日付レコードを変更する手順を順番に解説します。1. テーブルを作成するまず、日付型(date)のカラムを持つテーブルを作成します。mysql> create table DemoTable1984 ( ShippingDate date ); Query OK, 0 rows affected (0.00 sec)2. レコードを挿入する次に、INSERTコマンドを使ってテ