【MySQL】月や日がゼロの日付(例:2017-00-00)を保存する方法
MySQLでは、通常「月」や「日」がゼロになる日付は無効な値として扱われ、そのままINSERT文を実行するとエラーが発生してしまいます。しかし、SQLモードをALLOW_INVALID_DATESに設定することで、このような特殊な日付もテーブルに保存できるようになります。
本記事では、「年のみ有効で月と日の両方がゼロ」「月だけがゼロ」「日だけがゼロ」といった3パターンの日付を保存する具体的な手順を、実行例とともに解説します。
1. SQLモードをALLOW_INVALID_DATESに変更する
まず、以下のSET文を実行して、現在のセッションのSQLモードを変更します。
mysql> SET sql_mode = 'ALLOW_INVALID_DATES'; Query OK, 0 rows affected (0.00 sec)
この設定により、MySQLは月や日が範囲外(ゼロなど)の日付でも検証エラーにせず、そのまま受け入れるようになります。
2. 月と日の両方がゼロの日付を挿入する
次に、「2017-00-00」のように月と日の両方がゼロの日付を挿入してみます。
mysql> INSERT INTO check_date(OrderDate) VALUES('2017-00-00');
Query OK, 1 row affected (0.06 sec)
mysql> SELECT * FROM check_date;
+-------------+
| OrderDate |
+-------------+
| 2017-00-00 |
+-------------+
1 row in set (0.00 sec)
このように、年だけが有効で月と日がゼロの日付でも、問題なく登録できていることが確認できます。
3. 月だけがゼロの日付を挿入する
続いて、日だけが有効で月がゼロの「2017-00-05」を挿入します。
mysql> INSERT INTO check_date(Orderdate) VALUES('2017-00-05');
Query OK, 1 row affected (0.07 sec)
mysql> SELECT * FROM check_date;
+-------------+
| OrderDate |
+-------------+
| 2017-00-00 |
| 2017-00-05 |
+-------------+
2 rows in set (0.00 sec)
「月は未定だが日は5日」というようなデータを扱いたい場合にも、この方法が有効です。
4. 日だけがゼロの日付を挿入する
最後に、月は有効で日だけがゼロの「2017-05-00」を挿入します。
mysql> INSERT INTO check_date(Orderdate) VALUES('2017-05-00');
Query OK, 1 row affected (0.02 sec)
mysql> SELECT * FROM check_date;
+-------------+
| OrderDate |
+-------------+
| 2017-00-00 |
| 2017-00-05 |
| 2017-05-00 |
+-------------+
3 rows in set (0.00 sec)
この結果から、月が確定しているが日が未定のデータ(例:2017年5月中のある時点)も保存できることが分かります。
注意点
ALLOW_INVALID_DATESはセッション単位でのみ有効にしたい場合は上記のSET文だけで十分ですが、サーバー全体で恒久的に適用したい場合は、設定ファイル(my.cnf / my.ini)のsql-modeオプションに追加してください。- このモードを有効にすると、不正な日付が混在してもエラーにならないため、アプリケーション側での入力チェックやデータ検証がより重要になります。
- 「0000-00-00」そのものを扱う場合には、
NO_ZERO_DATEモードが有効になっていると制限されることがあるため、必要に応じてSQLモードの組み合わせを確認しましょう。
このように、SQLモードを活用すれば「年月日の一部が未確定」のような柔軟な日付データもMySQLで管理できます。ただし利用の際は、データ品質への影響を十分に考慮した上で導入することをおすすめします。
-
MySQLで日付データから月の初日と末日を取得する方法
MySQLでは、日付型のカラムから「その月の最初の日」と「最後の日」を簡単に求めることができます。この記事では、実際にテーブルを作成し、サンプルデータを使いながら具体的な手順を解説します。1. テーブルの作成まず、日付を格納するためのテーブルを作成します。mysql> create table DemoTable -> ( -> DueDate date -> ); Query OK, 0 rows affected (0.73 sec)2. レコードの挿入次に、INSERT文を使ってテーブルにいくつかのレコードを挿入します。mysql>
-
MySQLで現在の日付から1日以上の行を抽出する方法(INTERVALの使い方)
現在の日時を基準に「1日前以降」のデータを取得したい場合は、MySQLのINTERVALを使うと簡単に実現できます。この記事では、サンプルテーブルを作成し、実際に条件に合う行を抽出するまでの手順を順番に解説します。 1. 現在の日付を確認する まず、CURDATE()関数で現在の日付を確認しておきましょう。 mysql> select curdate(); +------------+ | curdate() | +------------+ | 2019-11-29 | +------------+ 1 row in set (0.00 sec) 現在の日付は「2019-11-29」