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

MySQLで今日以外のすべての行(レコード)を抽出する方法

MySQLでは、DATE()関数とCURDATE()関数を組み合わせることで、「今日の日付以外」のレコードだけを簡単に抽出できます。この記事では、実際にテーブルを作成し、データを挿入してから、今日以外の行を取得するクエリの書き方を順を追って解説します。

1. サンプルテーブルの作成

まず、名前(Name)と期限日(DueDate)を持つテーブルを作成します。

mysql> create table DemoTable
    -> (
    -> Name varchar(100),
    -> DueDate datetime
    -> );
Query OK, 0 rows affected (0.54 sec)

テーブルが正常に作成されました。DueDateカラムはDATETIME型なので、日付だけでなく時刻情報も格納できる点に注意してください。

2. テストデータの挿入

次に、INSERT文を使っていくつかのレコードを挿入します。ここでは現在の日付が「2019-07-03」であると仮定します。

mysql> insert into DemoTable values('Chris','2019-06-24');
Query OK, 1 row affected (0.12 sec)

mysql> insert into DemoTable values('Chris','2018-01-01');
Query OK, 1 row affected (0.13 sec)

mysql> insert into DemoTable values('Robert','2019-07-03');
Query OK, 1 row affected (0.21 sec)

mysql> insert into DemoTable values('Carol','2019-08-03');
Query OK, 1 row affected (0.22 sec)

挿入したデータを見ると、Robertのレコード(2019-07-03)だけが「今日」の日付に該当します。過去のレコードが2件、未来のレコードが1件あります。

3. 挿入した全レコードの確認

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

mysql> select *from DemoTable;

出力結果

+--------+---------------------+
| Name   | DueDate             |
+--------+---------------------+
| Chris  | 2019-06-24 00:00:00 |
| Chris  | 2018-01-01 00:00:00 |
| Robert | 2019-07-03 00:00:00 |
| Carol  | 2019-08-03 00:00:00 |
+--------+---------------------+
4 rows in set (0.00 sec)

4件のレコードが登録されていることが確認できました。

4. 今日以外の行を抽出するクエリ

それでは本題です。「今日以外のすべての行」を選択するには、以下のようなクエリを実行します。

mysql> select *from DemoTable where date(DueDate) !=curdate();

出力結果

+-------+---------------------+
| Name  | DueDate             |
+-------+---------------------+
| Chris | 2019-06-24 00:00:00 |
| Chris | 2018-01-01 00:00:00 |
| Carol | 2019-08-03 00:00:00 |
+-------+---------------------+
3 rows in set (0.00 sec)

実行結果から、今日(2019-07-03)のRobertのレコードが除外され、残りの3件だけが表示されました。

クエリのポイント解説

このクエリが正しく動作する仕組みは以下の通りです。

  • CURDATE():現在の日付(今日の日付)を「YYYY-MM-DD」形式で返す関数です。
  • DATE(DueDate):DATETIME型の値から時刻部分を取り除き、日付部分だけを抽出する関数です。
  • !=(不等号):両者が等しくない場合に真となる比較演算子です。

DueDateはDATETIME型のため、そのままCURDATE()と比較すると時刻情報まで含まれてしまい、意図した結果になりません。そこでDATE()関数で日付部分のみを取り出してから比較することで、「日付が今日ではない」レコードを正確に抽出できます。

まとめ

MySQLで今日以外のレコードを取得したい場合は、WHERE date(カラム名) != curdate()という条件を使うのが基本です。逆に「今日のレコードだけ」を取得したい場合は、=に変更すればOKです。また、より厳密なSQLとしては<>演算子を使う方法もあります。日付比較の際はDATETIME型の時刻部分の扱いに注意し、必ずDATE()関数で正規化してから比較するようにしましょう。

  1. MySQLのSELECTクエリで別テーブルに存在しない行を抽出する方法(NATURAL LEFT JOIN活用)

    MySQLのSELECTクエリで別テーブルに存在しない行を抽出する方法データベースの運用では、「片方のテーブルには存在するが、もう片方のテーブルには存在しないレコード」を抽出したい場面がよくあります。この記事では、2つのテーブルを作成し、NATURAL LEFT JOINを活用して差分の行を取得する方法を、実際のサンプルコードとともにわかりやすく解説します。1. 最初のテーブルを作成するまずは比較元となる最初のテーブルを作成します。 mysql> create table FirstTableDemo -> ( -> id int, -> name v

  2. MySQLでテーブルの最後の10件のレコードを取得する方法

    MySQLでテーブルの末尾にある10行(最新の10件)を取得したい場合は、SELECT文とLIMIT句を組み合わせたサブクエリを利用します。この記事では、実際にテーブルを作成し、データを挿入しながら、最後の10件を取得するクエリの手順を具体的に解説します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成します。 mysql> create table Last10RecordsDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected