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

MySQLで現在日時に最も近い次の日付を取得するクエリの書き方

MySQLでは、ORDER BY句とCASE式を組み合わせることで、「現在日時以降の日付の中で最も近い日」を1件だけ取得できます。この記事では、出荷日(ShippingDate)カラムを持つテーブルを例に、具体的な手順をわかりやすく解説します。

基本の構文

select * from yourTableName
order by ( yourColumnName > now()) desc, (case when yourColumnName > now() then yourColumnName end) ,
    yourColumnName  desc
limit 1;

サンプルテーブルを作成する

まず、日付型のカラムを持つテーブルを作成します。

mysql> create table DemoTable1454
    -> (
    -> ShippingDate date
    -> );
Query OK, 0 rows affected (0.59 sec)

レコードを挿入する

続いて、INSERT文を使って複数のレコードを登録します。

mysql> insert into DemoTable1454 values('2019-10-01');
Query OK, 1 row affected (0.22 sec)
mysql> insert into DemoTable1454 values('2019-10-03');
Query OK, 1 row affected (0.25 sec)
mysql> insert into DemoTable1454 values('2019-10-05');
Query OK, 1 row affected (0.25 sec)
mysql> insert into DemoTable1454 values('2019-10-04');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable1454 values('2018-10-06');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable1454 values('2019-10-06');
Query OK, 1 row affected (0.11 sec)

登録したレコードを確認する

SELECT文でテーブル内のすべてのレコードを表示してみましょう。

mysql> select * from DemoTable1454;

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

+--------------+
| ShippingDate |
+--------------+
| 2019-10-01   |
| 2019-10-03   |
| 2019-10-05   |
| 2019-10-04   |
| 2018-10-06   |
| 2019-10-06   |
+--------------+
6 rows in set (0.00 sec)

現在の日時を確認する

NOW()関数で現在の日時を確認しておきます。

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2019-10-04 21:30:01 |
+---------------------+
1 row in set (0.00 sec)

次に近い日付を取得するクエリ

以下のクエリを実行すると、現在日時より後の日付の中から最も近い日を1件取得できます。

mysql> select * from DemoTable1454
    -> order by ( ShippingDate > now()) desc,
    ->     (case when ShippingDate > now() then ShippingDate  end) ,
    ->    ShippingDate  desc
    -> limit 1;

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

+--------------+
| ShippingDate |
+--------------+
| 2019-10-05   |
+--------------+
1 row in set (0.00 sec)

クエリの仕組みを解説

このクエリが正しく動作するのは、ORDER BY句の各要素が次のように機能するためです。

  • (ShippingDate > now()) desc:比較結果は真なら1、偽なら0になります。降順ソートにより、未来の日付(1)が過去の日付(0)よりも先に並びます。
  • CASE WHEN ShippingDate > now() THEN ShippingDate END:未来の日付だけを昇順に並べ替え、最も近い未来日を先頭に持ってきます。過去の日付はNULLとなるため、この段階の順序には影響しません。
  • ShippingDate desc:未来の日付が1件も存在しない場合のフォールバックとして働き、過去の日付の中から最新のものが選ばれます。
  • limit 1:最終的な結果として1件だけを返します。

今回の例では、現在日時が「2019-10-04 21:30:01」であるため、それより後の日付「2019-10-05」と「2019-10-06」のうち、より近い「2019-10-05」が返されました。この手法を使えば、予約日や出荷日などから「次に近い未来の日付」を簡単に抽出できます。

  1. MySQLで指定した2つの日付の間にあるレコードの合計値を取得する方法

    はじめにMySQLで特定の2つの日付の間に存在するレコードの数値合計を求めたい場合は、BETWEENキーワードを使用します。BETWEEN句は、指定した範囲(開始日と終了日を含む)に該当するレコードを抽出できる便利な演算子です。この記事では、実際にテーブルを作成し、日付の範囲を指定して合計値を取得する手順を解説します。1. テーブルの作成まず、サンプル用のテーブルを作成します。ここでは「Value(数値)」と「PurchaseDate(購入日時)」というカラムを持つテーブルを定義します。mysql> create table DemoTable1444  -> (  -> V

  2. 異なる列にある2つの日付間の日数を計算するMySQLクエリ

    MySQLでは、DATEDIFF()関数を使うことで、同じテーブル内の異なる列に格納された2つの日付の差(日数)を簡単に計算できます。ここでは、社員の入社日と退職日から勤務日数を求める例を紹介します。1. テーブルを作成するまず、2つの日付型の列を持つテーブルを作成します。mysql> create table DemoTable1471-> (-> EmployeeJoiningDate date,-> EmployeeRelievingDate date-> );Query OK, 0 rows affected (0.57 sec)2. レコードを挿入するI