MySQLでタイムスタンプを比較する方法|DATE関数を使った実践例を解説
MySQLでタイムスタンプを比較するには、DATE()関数を使用します。DATE()関数は、TIMESTAMP型やDATETIME型の値から日付部分(YYYY-MM-DD)だけを抽出できる便利な関数です。
この記事では、実際にテーブルを作成し、タイムスタンプ同士を比較する手順をサンプルコードとともに分かりやすく解説します。
1. サンプルテーブルの作成
まず、比較用のテーブルを作成しましょう。
mysql> create table comparingTimestampDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> AdmissionDate timestamp
-> );
Query OK, 0 rows affected (0.54 sec)
このテーブルでは、Idカラムを主キー(AUTO_INCREMENT付き)とし、AdmissionDateカラムにTIMESTAMP型の日時データを格納します。
2. レコードの挿入
続いて、INSERT文を使ってテーブルにレコードを挿入します。
mysql> insert into comparingTimestampDemo(AdmissionDate) values('2019-03-31');
Query OK, 1 row affected (0.13 sec)
mysql> insert into comparingTimestampDemo(AdmissionDate) values('2019-04-10');
Query OK, 1 row affected (0.12 sec)
mysql> insert into comparingTimestampDemo(AdmissionDate) values('2019-04-15');
Query OK, 1 row affected (0.17 sec)
mysql> insert into comparingTimestampDemo(AdmissionDate) values('2019-03-29');
Query OK, 1 row affected (0.15 sec)
mysql> insert into comparingTimestampDemo(AdmissionDate) values('2019-04-07');
Query OK, 1 row affected (0.18 sec)なお、日付のみを指定して挿入した場合、時刻部分は自動的に「00:00:00」として登録されます。
3. テーブルの内容を確認する
SELECT文で全レコードを表示してみましょう。
mysql> select * from comparingTimestampDemo;
実行結果は以下の通りです。
+----+---------------------+
| Id | AdmissionDate |
+----+---------------------+
| 1 | 2019-03-31 00:00:00 |
| 2 | 2019-04-10 00:00:00 |
| 3 | 2019-04-15 00:00:00 |
| 4 | 2019-03-29 00:00:00 |
| 5 | 2019-04-07 00:00:00 |
+----+---------------------+
5 rows in set (0.00 sec)
4. DATE関数でタイムスタンプを比較する
ここからが本題です。DATE()関数を使い、「現在日付の3日前より前」のレコードを抽出してみます。
mysql> SELECT DATE(`AdmissionDate`) FROM comparingTimestampDemo WHERE
DATE(`AdmissionDate`) < CURDATE() - INTERVAL 3 DAY;
実行結果:
+-----------------------+
| DATE(`AdmissionDate`) |
+-----------------------+
| 2019-03-31 |
| 2019-03-29 |
+-----------------------+
2 rows in set (0.00 sec)
クエリのポイント
- DATE(AdmissionDate):TIMESTAMP型の値から日付部分だけを取り出します。
- CURDATE():現在の日付を返す関数です。
- CURDATE() - INTERVAL 3 DAY:現在の日付から3日前の日付を計算します。
つまり、このクエリは「現在日付の3日前よりも前に登録されたレコード」を抽出しています。INTERVALの値を変更すれば、「1週間前」「1ヶ月前」など任意の期間での比較も簡単に行えます。
補足:パフォーマンスに関する注意点
WHERE句でカラムに関数(DATE()など)を適用すると、インデックスが使われずフルテーブルスキャンになるケースがあります。大量のデータを扱う場合は、以下のように範囲指定で比較する方が効率的です。
-- インデックスを活用できる書き方の例
SELECT * FROM comparingTimestampDemo
WHERE AdmissionDate < CURDATE() - INTERVAL 3 DAY;
AdmissionDateカラムにインデックスを張っておけば、この書き方によりインデックスを利用した高速な検索が可能になります。
まとめ
MySQLでタイムスタンプを比較する基本は、DATE()関数で日付部分を抽出し、CURDATE()などの日付関数と組み合わせることです。ただし、パフォーマンスを重視する場合は、カラムへの関数適用を避けた範囲指定の比較も検討するとよいでしょう。
-
MySQLで月を指定してデータを抽出する方法(MONTH()関数の使い方)
MySQLで日付データから特定の「月」に該当するレコードだけを抽出したい場合は、MONTH()関数を使うのが便利です。この記事では、実際にテーブルを作成し、サンプルデータを挿入しながら、月を条件にしたSELECT文の書き方を具体的に解説します。1. サンプルテーブルの作成まずは、出荷日(Shippingdate)を格納するdatetime型のカラムを持つテーブルを作成します。mysql> create table DemoTable1599 -> ( -> Shippingdate d
-
MySQLで列(カラム)を分割する方法!SUBSTRING_INDEX関数の使い方を徹底解説
MySQLで列を分割するには?SUBSTRING_INDEX関数の基本MySQLで1つの列に格納された文字列を区切り文字で分割したい場合、SUBSTRING_INDEX()関数を使用します。この記事では、アンダースコア(_)で区切られた氏名データを分割する具体例を通じて、その使い方をわかりやすく解説します。1. サンプルテーブルの作成まず、以下のコマンドでテーブルを作成します。mysql> create table DemoTable -> ( -> Name varchar(40) -> );Query OK, 0 rows affected (1.