MySQL での 2つの日付の比較
この記事では、MySQL の 2つの日付の比較について説明します。このタスクを実行するには、3つの異なるアプローチがあります。
WHERE
句を使用するBETWEEN
演算子を使用するDATE_ADD
関数を使用する
テーブルの作成と値の挿入
まず最初に、employee のテーブルを以下のように作成します。
Create table employee (empid int primary key, fname varchar(10), lname varchar(20), logindate timestamp not null default CURRENT_TIMESTAMP);
ここで、デモンストレーションのためにテーブルにいくつかの値を挿入します。
INSERT INTO employee('empid', 'fname', 'lname')VALUES (1,'aaa','bbb');
INSERT INTO employee VALUES
(201,'Peter','Parker','2001-01-01 16:15:00'),
(202,'Thor','Odinson','2021-08-02 12:15:00'),
(204,'Loki','Laufeyson','2009-08-03 10:43:24');
WHERE
句を使用した 2つの日付の比較
以下のクエリは、指定された日付範囲のすべてのレコードを抽出する SELECT
クエリを使用した非常に簡単なアプローチです。
SELECT * FROM employee WHERE logindate >= '2000-07-05' AND logindate < '2011-11-10';
BETWEEN
演算子を使用して 2つの日付を比較する
まず、MySQL で日付を文字列に変換する必要があります。このタスクを実行するために、DATE 関数を使用して日時から日付を抽出します。
DATE 関数の構文は以下のとおりです。
DATE(column name)
logindate 列のインデックスを利用したい場合は、代わりにこれを試すことができます。Between 演算子を使用して、指定した 2つの日付式の間に日付列があるすべてのレコードを選択することもできます。
SELECT * FROM employee WHERE DATE(logindate) BETWEEN '2000-07-05' AND '2011-11-10';
MySQL では 1つの yyyy-mm-dd
日付形式しか使用できないため、文字列の日付式をフォーマットする必要がある場合は、常にこの形式を使用する必要があります。
さて、あなたは、比較して DATE()関数の必要性について質問があるかもしれませんか?
したがって、MySQL DATE()関数は、DATETIME 列または TIMESTAMP 列から次のように日付部分を文字列に抽出します。
mysql> SELECT DATE('2005-08-28 01:02:03'); -> '2005-08-28'
DATE()
関数は、MySQL が比較のために列値の日付部分のみを考慮するように使用されます。DATE()
関数を使用しない場合、MySQL は列の時間部分を文字列式と比較します。このオプションを使用すると、比較には、指定された文字列式が結果セットの一部として含まれます。
上記のクエリのように、DATETIME 列または TIME-STAMP 列を日付を表す文字列と比較する場合、MySQL は列と式の両方の値を比較のために長整数型に変換します。
これが、日付列を文字列と比較している場合でも、日付列の値を手動で文字列に変換する必要がない理由です。
DATE_ADD
関数を使用して 2つの日付を比較する
別のアプローチは、DATE_ADD()
関数を使用することです。ただし、このアプローチでは必ずしも DATE_ADD()
関数は必要ありません。ただし、希望する日付から数分後にソリューションの一部と見なしたい場合は、これを使用できます。たとえば、指定された日付範囲内のすべてのレコードが必要であるが、指定された制限の 15 分後に挿入されたレコードを考慮することができる場合。この機能はとても便利です。
DATE_ADD()関数は、指定された時間または日付間隔を指定された日付に追加してから、その日付を返すために使用されます。DATE_ADD 関数は 2つのパラメーターを取ります。最初のパラメーターは日付で、2 番目は追加される間隔です。
select * from employee
where logindate between '2000-07-05' and DATE_ADD('2011-07-10',INTERVAL 15 MINUTE);