文字列として表された日付に対し、MySQLの加算・減算・乗算・除算演算子はどう動作するのか?
MySQLでは、日付が文字列として表されている場合に、加算(+)、減算(-)、乗算(*)、除算(/)といった算術演算子を適用すると、予測できない結果になることがあります。
その理由は、MySQLが文字列に対して数値演算を実行しようとする際、文字列の先頭から読み取れる数値部分だけを取り出して計算に使用するためです。つまり、日付「2017-10-17」は「2017」という数値として解釈され、月や日の部分は一切考慮されません。
具体例
以下の実行例を見ると、この挙動がよく分かります。
mysql> select '2017-10-17' + 20; +-------------------+ | '2017-10-17' + 20 | +-------------------+ | 2037 | +-------------------+ 1 row in set, 1 warning (0.00 sec) mysql> select '2017-10-25' - 17; +-------------------+ | '2017-10-25' - 17 | +-------------------+ | 2000 | +-------------------+ 1 row in set, 1 warning (0.00 sec) mysql> select '2017-10-17' * 2; +-------------------+ | '2017-10-17' * 2 | +-------------------+ | 4034 | +-------------------+ 1 row in set, 1 warning (0.00 sec) mysql> select '2017-05-25'/5; +----------------+ | '2017-05-25'/5 | +----------------+ | 403.4 | +----------------+ 1 row in set, 1 warning (0.00 sec)
結果の解説
'2017-10-17' + 20→ 2037:先頭の数値「2017」だけが取り出され、2017 + 20 = 2037 となります。'2017-10-25' - 17→ 2000:同様に 2017 - 17 = 2000 となります。'2017-10-17' * 2→ 4034:2017 × 2 = 4034 となります。'2017-05-25'/5→ 403.4:2017 ÷ 5 = 403.4 となります。
また、各クエリで「1 warning」が表示されているのは、文字列から数値への暗黙的な型変換の際に、不正または切り捨てられた値が検出されたためです。
正しい日付計算の方法
日付に対して日数を加算・減算したい場合は、算術演算子ではなく DATE_ADD() や DATE_SUB()、あるいは ADDDATE() / SUBDATE() といった日付関数を使用しましょう。
mysql> SELECT DATE_ADD('2017-10-17', INTERVAL 20 DAY);
+------------------------------------------+
| DATE_ADD('2017-10-17', INTERVAL 20 DAY) |
+------------------------------------------+
| 2017-11-06 |
+------------------------------------------+
1 row in set (0.00 sec)このように日付関数を使えば、月末日の繰り上がりなども正しく処理され、意図通りの結果が得られます。
-
MySQLで論理AND演算子を使ってUPDATE文を実行する方法
MySQLで特定の条件を満たす行だけを更新したい場合、UPDATE文のWHERE句に論理AND演算子(AND)を組み合わせることで実現できます。複数の条件をすべて満たすレコードのみを対象に更新できるため、より精密なデータ操作が可能になります。ここでは、実際にサンプルテーブルを作成し、AND演算子を使ったUPDATE文の動作を順番に確認していきましょう。1. サンプルテーブルの作成まず、学生情報を格納するテーブルを作成します。mysql> create table DemoTable1616 -> ( &
-
MySQLで除算の精度を高める方法:CAST()関数による型変換の活用
MySQLで除算の精度を高めるには?MySQLで除算を行う際に精度を高めたい場合は、CAST()関数を使って値をDECIMAL型に変換します。整数同士の除算では小数点以下が切り捨てられてしまうため、明示的な型変換が重要になります。まず、サンプル用のテーブルを作成しましょう。mysql> create table DemoTable1823 ( Value int ); Query OK, 0 rows affected (0.00 sec)次に、INSERTコマンドでレコードを挿入します。mysql> insert into DemoTable1823 va