無効な日付にINTERVALキーワードを使うと、MySQLはどのような挙動を示すのか
無効な日付とINTERVALキーワード:MySQLの挙動はsql_modeによって決まる
MySQLで「2017-02-30」のような実際には存在しない日付に対してINTERVALキーワードを使って日付演算を行った場合、その結果はallow_invalid_datesモードが有効かどうかによって変わります。
このモードが無効な場合、MySQLは無効な日付を受け付けず、演算結果としてNULLを返します。一方、モードが有効になっている場合は、無効な日付もあたかも有効な日付であるかのように受け入れられ、通常どおりの日付演算が実行されます。
allow_invalid_datesモードが無効な場合の例
mysql> select '2017-02-30' + INTERVAL 7 day; +-------------------------------+ | '2017-02-30' + INTERVAL 7 day | +-------------------------------+ | NULL | +-------------------------------+ 1 row in set, 1 warning (0.00 sec)
上記の例では、「2017-02-30」という存在しない日付(2月30日)を指定しているため、MySQLは警告を発行し、結果としてNULLを返しています。
allow_invalid_datesモードを有効にした場合の例
次に、SET sql_mode = allow_invalid_dates;を実行してモードを有効にしてみましょう。
mysql> set sql_mode = allow_invalid_dates; Query OK, 0 rows affected (0.05 sec)
モードを有効にすると、MySQLは無効な日付を受け入れ、次のように通常どおりの日付演算を行います。
mysql> select '2017-02-30' + INTERVAL 7 day; +-------------------------------+ | '2017-02-30' + INTERVAL 7 day | +-------------------------------+ | 2017-03-09 | +-------------------------------+ 1 row in set (0.00 sec) mysql> select '2017-11-31' + INTERVAL 7 day; +-------------------------------+ | '2017-11-31' + INTERVAL 7 day | +-------------------------------+ | 2017-12-08 | +-------------------------------+ 1 row in set (0.00 sec)
最初の例では、「2017-02-30」に7日を加算して「2017-03-09」という結果が得られています。また、「2017-11-31」(11月31日は存在しません)に7日を加算した場合は「2017-12-08」と返されました。
まとめ
- allow_invalid_datesモードが無効: 無効な日付は拒否され、NULLが返される。
- allow_invalid_datesモードが有効: 無効な日付も許容され、通常どおりの日付演算が実行される。
このように、無効な日付を使ったINTERVAL演算の結果を予測するには、事前にサーバーのsql_mode設定を確認しておくことが重要です。
-
MySQLでCURDATE()とLIKE句を使った部分一致検索の方法
MySQLにはCONTAINS()という名前の関数は存在しません。そのため、現在の日付(CURDATE())に関連する文字列で部分一致検索を行いたい場合は、CONCAT()関数とLIKE句を組み合わせる方法が有効です。本記事では、実際にサンプルテーブルを作成しながら、その手順を順番に解説していきます。現在の日付を確認するまず、CURDATE()関数を使って現在の日付を取得してみましょう。mysql> select curdate();実行結果は以下の通りです。+------------+ | curdate() | +------------+ | 2019-11-28 | +----
-
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コマンドを使ってテ