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モードの活用も検討すると良いでしょう。
-
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
-
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