MySQLで年のみの値を持つ日付(月と日はゼロ)を保存する方法
MySQLでは、月と日の部分がゼロ(00)となっている、年のみの値を持つ日付(例:2017-00-00)をテーブルに保存できます。ただしこれを実現するには、SQLモードのNO_ZERO_IN_DATEを無効にしておく必要があります。このモードが有効な場合、MySQLは月または日にゼロを含む日付を無効な日付とみなし、代わりにすべてがゼロの値(0000-00-00)を格納します。
mysql> Insert into year_testing (OrderDate) values('2017:00:00');
Query OK, 1 row affected (0.09 sec)
mysql> select * from year_testing;
+------------+
| OrderDate |
+------------+
| 2017-00-00 |
+------------+
1 row in set (0.00 sec)上記の例では、NO_ZERO_IN_DATEモードが無効な状態で挿入を行ったため、「2017-00-00」という年のみの日付がそのまま保存されています。
NO_ZERO_IN_DATEモードを有効にした場合の挙動
次に、SET文を使ってsql_modeにNO_ZERO_IN_DATEを設定し、同じデータの挿入を試みてみます。
mysql> SET sql_mode = 'NO_ZERO_IN_DATE';
Query OK, 0 rows affected (0.00 sec)
mysql> Insert into year_testing(OrderDate) values('2017:00:00');
Query OK, 1 row affected, 1 warning (0.04 sec)
mysql> Select * from year_testing;
+------------+
| OrderDate |
+------------+
| 2017-00-00 |
| 0000-00-00 |
+------------+
2 rows in set (0.00 sec)結果を見ると、2回目のINSERTでは警告(warning)が発生し、実際に保存されたのは「0000-00-00」というすべてゼロの値になっています。これは、NO_ZERO_IN_DATEモードによって月・日がゼロの日付が無効と判断されたためです。
補足:STRICTモードとの組み合わせについて
なお、厳密モード(STRICT_TRANS_TABLESなど)と組み合わせた場合、NO_ZERO_IN_DATEが有効な状態で月・日にゼロを含む日付を挿入すると、警告ではなくエラーとなり、挿入自体が失敗します。MySQL 5.7以降では、STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATEを含むモードがデフォルトで有効になっているため、年のみの日付を許可したい場合は、sql_modeから該当するモードを除外して設定する必要があります。
-
MySQLの1つのクエリで日付に1年と2日を追加する方法
MySQLで日付に1年と2日を同時に加算したい場合は、DATE_ADD関数とINTERVALを組み合わせます。DATE_ADD関数を入れ子(ネスト)にするのがポイントです。ここでは、実際にテーブルを作成してサンプルデータを操作しながら、手順を詳しく解説します。 1. サンプルテーブルを作成する まず、日付(DATE型)を格納するカラムを持つテーブルを作成します。 mysql> create table DemoTable1376 -> ( -> AdmissionDate date -> ); Query OK, 0 rows affected
-
MySQLで特定の値を検索してNULLに置き換える方法をわかりやすく解説
MySQLで値を検索してNULLに置き換える基本構文 MySQLでテーブル内の特定の値を見つけてNULLに置き換えたい場合は、UPDATE文とSET句を使って yourColumnName = NULL のように指定します。基本的な構文は以下の通りです。 update yourTableName set yourColumnName=NULL where yourColumnName=yourValue; WHERE句で対象となる値を指定することで、該当する行だけをNULLに更新できるのがポイントです。 サンプルテーブルの作成 まずは動作確認用のテーブルを作成しましょう。 mysql>