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

MySQLで異なる列の日付と時刻を組み合わせてDateTime値と比較する方法

MySQLでは、別々の列に保存された日付(DATE型)と時刻(TIME型)をCONCAT()関数で連結することで、1つの日時(DateTime)値として扱い、比較することができます。

基本構文

以下が基本的な構文です。

SELECT * FROM yourTableName
WHERE CONCAT(yourDateColumnName, ' ', yourTimeColumnName) > 'yourDateTimeValue';

CONCAT()関数で日付列と時刻列を連結すると、「YYYY-MM-DD HH:MM:SS」という形式の日時文字列が生成され、これを指定した日時値と比較できます。

サンプルテーブルの作成

実際に動作を確認するため、テーブルを作成してみましょう。以下のクエリを実行します。

mysql> create table DifferentDateTime
    -> (
    -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> ArrivalDate date,
    -> ArrivalTime time
    -> );
Query OK, 0 rows affected (1.53 sec)

このテーブルは、到着日付(ArrivalDate)と到着時刻(ArrivalTime)を別々の列で管理する構造になっています。

テストデータの挿入

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

mysql> insert into DifferentDateTime(ArrivalDate,ArrivalTime) values(curdate(),'10:27:30');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DifferentDateTime(ArrivalDate,ArrivalTime) values('2016-04-24','15:00:00');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DifferentDateTime(ArrivalDate,ArrivalTime) values('2015-12-25','12:30:30');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DifferentDateTime(ArrivalDate,ArrivalTime) values('2012-01-31','16:00:30');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DifferentDateTime(ArrivalDate,ArrivalTime) values('2000-07-12','09:45:31');
Query OK, 1 row affected (0.11 sec)

最初のレコードではcurdate()関数を使用して現在の日付を自動的に取得しています。それ以外のレコードには特定の日付を直接指定しています。

登録データの確認

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

mysql> select *from DifferentDateTime;

実行結果:

+----+-------------+-------------+
| Id | ArrivalDate | ArrivalTime |
+----+-------------+-------------+
|  1 |  2019-02-14 |    10:27:30 |
|  2 |  2016-04-24 |    15:00:00 |
|  3 |  2015-12-25 |    12:30:30 |
|  4 |  2012-01-31 |    16:00:30 |
|  5 |  2000-07-12 |    09:45:31 |
+----+-------------+-------------+
5 rows in set (0.00 sec)

日付と時刻を組み合わせた比較クエリ

それでは、CONCAT()関数を使って異なる列の日付と時刻を組み合わせ、指定した日時値と比較してみましょう。

mysql> select *from DifferentDateTime 
where concat(ArrivalDate,' ',ArrivalTime) > '2007-01-31 12:30:30';

このクエリでは、「2007年1月31日 12:30:30」より後の日時に該当するレコードのみを抽出しています。

実行結果:

+----+-------------+-------------+
| Id | ArrivalDate | ArrivalTime |
+----+-------------+-------------+
|  1 |  2019-02-14 |    10:27:30 |
|  2 |  2016-04-24 |    15:00:00 |
|  3 |  2015-12-25 |    12:30:30 |
|  4 |  2012-01-31 |    16:00:30 |
+----+-------------+-------------+
4 rows in set (0.00 sec)

実行結果の解説

上記の結果から、Id 1〜4の4件が抽出されました。Id 5の「2000-07-12 09:45:31」は比較対象の日時「2007-01-31 12:30:30」よりも過去であるため、結果から除外されています。

注意点

CONCAT()で連結する際は、日付と時刻の間に半角スペースを挟むことをおすすめします。スペースなしで連結した場合でも多くの場合は正しく比較できますが、日時文字列として標準的な形式(YYYY-MM-DD HH:MM:SS)にしておくことで、意図しない比較ミスを防げます。

また、大量のデータを扱う場合、CONCAT()による連結ではインデックスが利用できずパフォーマンスに影響が出る可能性があります。そのようなケースでは、生成カラム(Generated Column)やTIMESTAMP型への統合も検討するとよいでしょう。

  1. MySQLのCASE文で同じ列から条件別に値を取り出し、別々の列に表示する方法

    MySQLのCASE文で同じ列から条件別に値を取り出す方法 MySQLである列(カラム)の値を複数の条件で判定し、それぞれの結果を別々の列として表示したい場合は、CASE文を使用します。CASE文を組み合わせることで、1つの列から条件に応じた異なる値を柔軟に取り出せます。 まず、サンプル用のテーブルを作成しましょう。 mysql> create table DemoTable (     Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,     Name varchar

  2. MySQLで異なる日付形式の日付レコードを同じテーブルに挿入する方法

    MySQLでは、INSERT INTO SELECT文とDATE_FORMAT()関数を組み合わせることで、異なる日付形式に変換したデータを同じテーブルに挿入できます。この記事では、実際の手順をサンプルコードとともに解説します。1. テーブルを作成するまず、datetime型のカラムとtext型のカラムを持つテーブルを作成します。mysql> create table DemoTable    -> (    -> DateOfJoining datetime,