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

【MySQL】「1965-05-15」のような日付をTIMESTAMPに変換すると0(ゼロ)が返される理由とは?

UNIX_TIMESTAMP関数で古い日付が0になる原因

MySQLのUNIX_TIMESTAMP関数を使用すると、指定した日付や日時(DateTime)から、Unixエポックからの経過秒数を取得することができます。しかし、「1965-05-15」のような日付を変換しようとすると、結果は0(ゼロ)となってしまいます。

その理由は、TIMESTAMP型の有効範囲が「1970-01-01 00:00:01」から「2038-01-19 08:44:07」までに限定されているためです。この範囲外の日付値は変換することができず、その場合、UNIX_TIMESTAMP関数は常に0を返します。

動作確認の例

実際の動作を、以下の例で確認してみましょう。

例1:TIMESTAMPの範囲より前の日付(1965年)

mysql> Select UNIX_TIMESTAMP('1965-05-15');
+----------------------------------------------+
| unix_timestamp('1965-05-15 05:04:30')        |
+----------------------------------------------+
|                                            0 |
+----------------------------------------------+
1 row in set (0.00 sec)

1965年は1970年以前の日付のため、TIMESTAMPの範囲外であり、結果として0が返されます。

例2:TIMESTAMPの範囲内の日付(1970年)

mysql> select UNIX_TIMESTAMP('1970-05-15 05:04:30');
+----------------------------------------------+
| unix_timestamp('1970-05-15 05:04:30')        |
+----------------------------------------------+
|                                     11576070 |
+----------------------------------------------+
1 row in set (0.00 sec)

一方、1970年5月15日はTIMESTAMPの有効範囲内であるため、正しく経過秒数11576070が返されます。

まとめ

UNIX_TIMESTAMP関数で0が返される場合は、対象の日付がTIMESTAMP型の有効範囲(1970-01-01 00:00:01〜2038-01-19 08:44:07)から外れていないかを確認しましょう。それより古い日付や新しい日付を扱いたい場合は、DATETIME型の使用や、別の方法での日付計算を検討する必要があります。

  1. PHP・MySQLで日付形式をdd/mm/yyyyに変更する方法

    PHPやMySQLでは、日付の表示形式を自由に変更できます。本記事では、日付を「dd/mm/yyyy(日/月/年)」形式に変換する方法を、PHPとMySQLそれぞれのケースについて解説します。PHPで日付形式を変更する方法PHPでは、date()関数を使って日付形式を簡単に変更できます。基本構文は以下の通りです。date(d/m/Y, 日時の変数);また、文字列を日付として扱う場合は、strtotime()関数を使用します。この関数は、日付を表す文字列をUnixタイムスタンプに変換してくれるため、date()関数と組み合わせて使うのが一般的です。以下は、日時を「dd/mm/yyyy」形式に整形

  2. MySQLデータベースで2020-04-30ではなく30-04-2020形式の日付を表示する方法

    MySQLで日付を「2020-04-30」ではなく「30-04-2020」のような形式で表示したい場合は、DATE_FORMAT()関数を使用します。構文は以下のとおりです。select date_format(yourColumnName,%d-%m-%Y) as anyAliasName from yourTableName;テーブルの作成例まず、サンプル用のテーブルを作成しましょう。mysql> create table demo80 -> ( -> due_date date -> );Query OK, 0 rows affected (0.