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

MySQLでDATETIME型フィールドの日付を更新する方法をわかりやすく解説

MySQLでDATETIME型フィールドの日付部分を更新したい場合、算術演算子のマイナス(-)と INTERVAL を組み合わせることで簡単に実現できます。この記事では、実際のSQL文と実行結果をもとに、具体的な手順を順番に解説していきます。

基本構文

DATETIME型の値から指定した日数を引くには、次のような構文を使用します。

update yourTableName
set yourDateTimeColumnName = yourDateTimeColumnName - interval yourValue day
where date(yourDateTimeColumnName) = 'yourDateValue';

ポイントは以下の3つです。

  • interval 数値 day のように単位を指定して減算できる
  • where date(カラム名) を使うことで、時刻を無視して日付だけを条件にできる
  • 元の時刻部分(00:00:00など)は保持されたまま、日付のみが更新される

サンプルテーブルを作成する

それでは、動作を確認するためにテーブルを作成しましょう。テーブル作成のクエリは次のとおりです。

mysql> create table updateDateDemo
    -> (
    -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> ArrivalDate datetime
    -> );
Query OK, 0 rows affected (0.66 sec)

Id を自動採番の主キーとし、到着日時を格納する ArrivalDate カラムをDATETIME型で定義しています。

テストデータを挿入する

INSERTコマンドを使って、いくつかのレコードを登録します。

mysql> insert into updateDateDemo(ArrivalDate) values('2011-01-13');
Query OK, 1 row affected (0.19 sec)
mysql> insert into updateDateDemo(ArrivalDate) values('2013-04-21');
Query OK, 1 row affected (0.11 sec)
mysql> insert into updateDateDemo(ArrivalDate) values('2016-12-22');
Query OK, 1 row affected (0.14 sec)
mysql> insert into updateDateDemo(ArrivalDate) values('2017-02-25');
Query OK, 1 row affected (0.27 sec)
mysql> insert into updateDateDemo(ArrivalDate) values('2018-08-19');
Query OK, 1 row affected (0.17 sec)
mysql> insert into updateDateDemo(ArrivalDate) values('2019-02-27');
Query OK, 1 row affected (0.24 sec)

登録済みレコードを確認する

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

mysql> select *from updateDateDemo;

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

+----+---------------------+
| Id | ArrivalDate         |
+----+---------------------+
| 1  | 2011-01-13 00:00:00 |
| 2  | 2013-04-21 00:00:00 |
| 3  | 2016-12-22 00:00:00 |
| 4  | 2017-02-25 00:00:00 |
| 5  | 2018-08-19 00:00:00 |
| 6  | 2019-02-27 00:00:00 |
+----+---------------------+
6 rows in set (0.00 sec)

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

DATETIME型フィールドの日付を更新する

ここで、「2019-02-27」のレコードの日付を7日前に更新してみます。実行するクエリは次のとおりです。

mysql> update updateDateDemo
   -> set ArrivalDate = ArrivalDate - interval 7 day
   -> where date(ArrivalDate) = '2019-02-27';
Query OK, 1 row affected (0.13 sec)
Rows matched: 1 Changed: 1 Warnings: 0

ArrivalDate - interval 7 day により、該当レコードの日付が7日分減算されます。WHERE句で date() 関数を使用しているため、日付が「2019-02-27」と一致するレコードだけが対象になります。

更新後のレコードを確認する

再度SELECT文を実行して、更新結果を確認しましょう。

mysql> select *from updateDateDemo;

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

+----+---------------------+
| Id | ArrivalDate         |
+----+---------------------+
| 1  | 2011-01-13 00:00:00 |
| 2  | 2013-04-21 00:00:00 |
| 3  | 2016-12-22 00:00:00 |
| 4  | 2017-02-25 00:00:00 |
| 5  | 2018-08-19 00:00:00 |
| 6  | 2019-02-20 00:00:00 |
+----+---------------------+
6 rows in set (0.00 sec)

Id=6のレコードが「2019-02-27」から「2019-02-20」に更新されました。他のレコードには影響がなく、意図したとおり日付だけが変更されています。

補足:INTERVALで使える主な単位

INTERVAL では「day」以外にもさまざまな単位を指定できます。用途に応じて使い分けると便利です。

  • interval 1 year … 1年加算・減算
  • interval 3 month … 3か月加算・減算
  • interval 10 day … 10日加算・減算
  • interval 5 hour … 5時間加算・減算
  • interval 30 minute … 30分加算・減算
  • interval 45 second … 45秒加算・減算

また、足し算を行いたい場合はマイナスではなくプラス(+)を使えばOKです。さらに、月末日付の扱いなどより柔軟な日付計算が必要な場合は、DATE_SUB()DATE_ADD() 関数も検討するとよいでしょう。

  1. JavaScriptの日時をMySQLの日時形式に変換する方法

    JavaScriptで取得した日時をMySQLの日時形式(YYYY-MM-DD HH:MM:SS)に変換するには、toISOString()メソッドを活用するのが便利です。toISOString()は日付をISO 8601形式の文字列(例:2018-11-23T11:14:38.000Z)で返します。この文字列から必要な部分を切り出し、「T」を半角スペースに置き換えることで、MySQLで扱える日時形式に変換できます。以下に、JavaScriptの実装例を示します。サンプルコード<!DOCTYPE html> <html>    <head>

  2. JavaでMySQLデータベースのレコードを更新する方法【UPDATE文の使い方を実例で解説】

    MySQLデータベースのテーブルに格納されたデータを更新するには、UPDATEコマンドを使用します。本記事では、UPDATE文の基本構文から、実際にテーブルを作成し、Java(JDBC)経由でレコードを更新するまでの一連の手順を、サンプルコード付きで詳しく解説します。 UPDATE文の基本構文 MySQLで既存のデータを更新する場合、以下の構文を使用します。 update テーブル名 set カラム名1 = 値1, ....N where 条件; where句で条件を指定しないと、テーブル内のすべてのレコードが更新されてしまうため注意が必要です。 ステップ1:テーブルの作成 まずは更新用のサン