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

MySQLでDATETIME型の時刻部分を無視して日付だけを比較する方法

MySQLでは、DATETIME型のカラムに格納された日時データから「時間部分」を除外し、日付だけで比較したいケースがよくあります。例えば、「特定の日にログインしたユーザーをすべて抽出したい」場合などです。そのようなときに便利なのが DATE() 関数です。この関数を使うことで、DATETIME値から日付部分のみを取り出して比較できます。

基本構文

日付部分だけを比較する基本構文は以下のとおりです。

SELECT * FROM テーブル名 WHERE DATE(カラム名) = 比較したい日付;

実際に試してみよう

ここでは、サンプルテーブルを作成して動作を確認してみます。まずはテーブルの作成です。

mysql> create table ComparingDate
    -> (
    -> Name varchar(100),
    -> Login datetime
    -> );
Query OK, 0 rows affected (0.50 sec)

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

mysql> insert into ComparingDate values('John','2014-04-06 22:50:45');
Query OK, 1 row affected (0.15 sec)

mysql> insert into ComparingDate values('Bob','2018-12-15 15:07:46');
Query OK, 1 row affected (0.14 sec)

mysql> insert into ComparingDate values('Carol','2016-03-10 21:50:40');
Query OK, 1 row affected (0.18 sec)

mysql> insert into ComparingDate values('David','1995-08-08 23:40:47');
Query OK, 1 row affected (0.14 sec)

SELECT文で全レコードを表示して、データが正しく登録されているか確認しましょう。

mysql> select *from ComparingDate;

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

+-------+---------------------+
| Name  | Login               |
+-------+---------------------+
| John  | 2014-04-06 22:50:45 |
| Bob   | 2018-12-15 15:07:46 |
| Carol | 2016-03-10 21:50:40 |
| David | 1995-08-08 23:40:47 |
+-------+---------------------+
4 rows in set (0.00 sec)

日付のみを比較するクエリ

それでは、時刻を無視して日付だけを比較するクエリを実行します。ここでは「2016年3月10日」に該当するレコードを抽出します。

mysql> select *from ComparingDate where date(Login) = '2016-03-10';

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

+-------+---------------------+
| Name  | Login               |
+-------+---------------------+
| Carol | 2016-03-10 21:50:40 |
+-------+---------------------+
1 row in set (0.00 sec)

上記の出力を見ると、時刻が異なっていても Login の日付部分が「2016-03-10」であるCarolのレコードが正しく取得できていることがわかります。

補足:インデックスとパフォーマンスについて

DATE() 関数は非常に便利ですが、WHERE句内でカラムに関数を適用するとインデックスが利用されず、大量データの場合は検索が遅くなる可能性があります。パフォーマンスが重要な場合は、以下のように範囲指定で比較する方法も有効です。

SELECT * FROM ComparingDate
WHERE Login >= '2016-03-10 00:00:00'
  AND Login < '2016-03-11 00:00:00';

この書き方ならインデックスが活用されるため、大規模なテーブルでも高速に検索できます。用途に応じて両者の使い分けを検討するとよいでしょう。

  1. MySQLで時刻はそのままに日付(年)だけを変更する方法

    MySQLでは、INTERVAL演算子を使うことで、時刻部分はそのまま維持したまま、日付部分だけを変更できます。既存のレコードを更新するため、UPDATE文と組み合わせてINTERVALで新しい値を設定します。テーブルを作成するまず、例としてテーブルを作成してみましょう。mysql> create table DemoTable ( DueDate datetime ); Query OK, 0 rows affected (0.56 sec)レコードを挿入するINSERT文を使って、テーブルにいくつかのレコードを追加します。mysql> insert into DemoT

  2. MySQLでchar型カラムをdatetime型に変換する方法をわかりやすく解説

    MySQLでは、char型として保存された日付文字列をdatetime形式に変換したいケースがあります。本記事では、REPLACE関数とSTR_TO_DATE関数を組み合わせて、「12/31/2017 10:50」のような米国式の日付文字列を「2017-12-31 10:50:00」というdatetime形式へ変換する手順を、実際のSQLと実行結果付きで解説します。サンプルテーブルの作成まず、テーブルを作成します。ここでは配送日(ShippingDate)をあえてchar型として宣言しています。mysql> create table DemoTable1472  &n