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

MySQLテーブルに格納された日付値に対する四則演算(+、-、×、÷)はどのように処理されるのか?

MySQLにおける日付値と算術演算子の関係

MySQLでは、テーブルに格納されている日付値に対して加算(+)、減算(-)、乗算(*)、除算(/)といった算術演算子を適用すると、その日付値は数値として解釈され、単純な数値計算が実行されます。例えば「2017-05-25」という日付は「20170525」という数値に変換されてから計算されるため、演算結果は必ずしも有効な日付にはなりません。

具体例による確認

以下の例では、orderdateカラムに日付値「2017-05-25」が格納されたテーブル「example」を使用して、各演算子の実際の挙動を確認していきます。

mysql> select * from example;
+------------+
| orderdate |
+------------+
| 2017-05-25 |
+------------+
1 row in set (0.00 sec)

加算(+)の場合

日付値に10を加えると、「20170525 + 10 = 20170535」という純粋な数値計算が行われます。結果にはハイフンがなく、単なる数値として返されます。

mysql> select orderdate+10 from example;
+--------------+
| orderdate+10 |
+--------------+
| 20170535 |
+--------------+
1 row in set (0.00 sec)

減算(-)の場合

同様に、10を引くと「20170525 - 10 = 20170515」という結果になります。

mysql> select orderdate-10 from example;
+--------------+
| orderdate-10 |
+--------------+
| 20170515 |
+--------------+
1 row in set (0.00 sec)

乗算(*)の場合

10を掛けると「20170525 × 10 = 201705250」となり、桁数が増えた単なる数値が返されます。

mysql> select orderdate*10 from example;
+--------------+
| orderdate*10 |
+--------------+
| 201705250 |
+--------------+
1 row in set (0.00 sec)

除算(/)の場合

10で割ると「20170525 ÷ 10 = 2017052.5」という小数を含む結果となります。

mysql> select orderdate/10 from example;
+--------------+
| orderdate/10 |
+--------------+
| 2017052.5 |
+--------------+
1 row in set (0.00 sec)

正しい日付計算を行うには

上記の結果から分かるように、算術演算子を使った日付の計算は、意味のある日付操作にはなりません。例えば「20170535」は実際には存在しない日付です。日付そのものを加減したい場合は、MySQLが用意している日付関数を使用する必要があります。

  • DATE_ADD() / ADDDATE():日付に指定した期間を加算します
  • DATE_SUB() / SUBDATE():日付から指定した期間を減算します
  • DATEDIFF():2つの日付の差(日数)を求めます

例えば、10日後の日付を取得したい場合は、次のように記述します。

mysql> SELECT DATE_ADD(orderdate, INTERVAL 10 DAY) FROM example;

まとめ

MySQLの算術演算子は、日付値を「YYYYMMDD」形式の数値として扱い、単純な数値計算を実行します。このため演算結果は無効な日付になることが多く、実務では意図しないバグの原因になり得ます。日付の加減算を行いたい場合は、DATE_ADD()やDATE_SUB()などの専用の日付関数を使うのが安全です。

  1. MySQLでテーブルの日付レコードを変更する方法|UPDATEとDATE_ADD()の使い方

    MySQLで保存済みの日付データに年数を加算して変更したい場合、UPDATEコマンドとDATE_ADD()関数を組み合わせることで簡単に実現できます。ここでは、実際のSQLクエリ例を使いながら、日付レコードを変更する手順を順番に解説します。1. テーブルを作成するまず、日付型(date)のカラムを持つテーブルを作成します。mysql> create table DemoTable1984 ( ShippingDate date ); Query OK, 0 rows affected (0.00 sec)2. レコードを挿入する次に、INSERTコマンドを使ってテ

  2. MySQLストアドプロシージャでDELIMITER(区切り文字)を正しく使って値を挿入する方法

    MySQLでストアドプロシージャを作成する際、DELIMITER(区切り文字)の扱いに戸惑う方は少なくありません。デフォルトではMySQLクライアントがセミコロン「;」を文の終端として解釈するため、プロシージャ内の複数のSQL文が途中で分割されてしまうことがあります。本記事では、区切り文字を正しく変更しながら、ストアドプロシージャを使ってテーブルへ値を挿入する具体的な手順を解説します。 1. サンプルテーブルを作成する まず、データを挿入するためのテーブルを作成します。ここでは学生の名前と姓を格納するテーブルを用意しました。 mysql> create table DemoTable