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

MySQLは日付「0000-00-00」の年をYear(2)・Year(4)どちらの形式で返す?答えは「0」

MySQLが「0000-00-00」から返す年の値とは

MySQLのテーブルに日付値として「0000-00-00」(ゼロ日付)が保存されている場合、そのような日付から年を抽出すると、MySQLは 0 を返します。このとき、結果はYear(2)形式にもYear(4)形式にもならない点に注意が必要です。

実際の動作を確認するために、「detail_bday」というテーブルに以下のデータが登録されているケースを例に見ていきましょう。6番目のレコード「Ram」には、誕生日として「0000-00-00」が保存されています。

mysql> Select * from detail_bday;
+----+---------+------------+
| Sr | Name    | Birth_Date |
+----+---------+------------+
| 1  | Saurabh | 1990-05-12 |
| 2  | Raman   | 1993-06-11 |
| 3  | Gaurav  | 1984-01-17 |
| 4  | Rahul   | 1993-06-11 |
| 5  | Sonia   | 1993-11-31 |
| 6  | Ram     | 0000-00-00 |
+----+---------+------------+
6 rows in set (0.00 sec)

ゼロ日付から年を取得するクエリ

次のクエリを実行すると、「0000-00-00」という日付から年を取り出そうとします。

mysql> Select Year(Birth_date) from detail_bday Where Name = 'Ram';
+------------------+
| Year(Birth_date) |
+------------------+
|                0 |
+------------------+
1 row in set (0.00 sec)

上記の結果セットが示すように、MySQLはYear(2)やYear(4)といった形式の値を返す代わりに、単純に 0 を返します。つまり、無効な(ゼロの)日付に対してYEAR()関数を実行した場合の戻り値は、常に0になるというわけです。

補足:ゼロ日付の扱いを制御する方法

なお、MySQLではSQLモードの設定によって、「0000-00-00」のようなゼロ日付の挿入自体を防ぐことも可能です。NO_ZERO_DATEモード(厳密モードSTRICT_TRANS_TABLESと組み合わせて使われるのが一般的)を有効にしておけば、無効な日付がテーブルに保存される段階でエラーが発生するため、データ品質を事前に担保できます。アプリケーション側で日付のバリデーションを行うとともに、SQLモードの活用も検討すると良いでしょう。

  1. MySQLで「10/12/2010」形式の日付から特定の年を抽出してテーブルのレコードを更新する方法

    日付が「10/12/2010」のような文字列形式(日/月/年)で保存されている場合、STR_TO_DATE()関数で日付に変換し、YEAR()関数と組み合わせることで、特定の年に該当するレコードだけを更新できます。基本構文UPDATE yourTableName SET yourColumnName1 = yourValue1 WHERE YEAR(STR_TO_DATE(yourColumnName2, %d/%m/%Y)) = yourValue2;サンプルテーブルの作成まず、動作確認用のテーブルを作成しましょう。mysql> create table DemoTable1924

  2. MySQLで日付形式から数値の日付値を抽出する方法

    MySQLで日付形式から数値の日付値を抽出する方法MySQLで「31-Jan-19」のような文字列として保存された日付データを数値(UNIXタイムスタンプ)に変換したい場合は、UNIX_TIMESTAMP() 関数と STR_TO_DATE() 関数を組み合わせて使用します。基本的な構文は以下の通りです。select UNIX_TIMESTAMP(STR_TO_DATE(yourColumnName, %d-%b-%y)) as anyAliasName from yourTableName;サンプルテーブルの作成まず、動作確認用のテーブルを作成します。mysql> create tab