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

MySQLのUNIX_TIMESTAMP関数に渡せる日時値の範囲とは?TIMESTAMP型の範囲と2038年問題を解説

MySQLのUNIX_TIMESTAMP関数に引数として渡すことができる日時値の範囲は、TIMESTAMPデータ型の範囲と同一です。具体的には、「1970-01-01 00:00:01」から「2038-01-19 08:44:07」までの間となります。

この範囲は、UNIXタイムスタンプが符号付き32ビット整数で管理されていることに由来します。1970年1月1日0時0分1秒(UTC)を起点とし、32ビット整数で表現できる上限が2038年1月19日8時44分7秒(UTC)にあたります。この上限は一般に「2038年問題」として知られています。

範囲外の日時値を指定した場合の動作

TIMESTAMP型の範囲を超える、または範囲に満たない日時値をUNIX_TIMESTAMP関数に渡した場合、MySQLは0を返します。以下の実行例でその挙動を確認できます。

mysql> select UNIX_TIMESTAMP('2038-01-19 08:44:07');
+---------------------------------------+
| UNIX_TIMESTAMP('2038-01-19 08:44:07') |
+---------------------------------------+
| 2147483647                            |
+---------------------------------------+
1 row in set (0.00 sec)

mysql> select UNIX_TIMESTAMP('2038-01-19 08:44:08');
+---------------------------------------+
| UNIX_TIMESTAMP('2038-01-19 08:44:08') |
+---------------------------------------+
|                                     0 |
+---------------------------------------+
1 row in set (0.00 sec)

mysql> select UNIX_TIMESTAMP('1969-01-01 05:10:00');
+---------------------------------------+
| UNIX_TIMESTAMP('1969-01-01 05:10:00') |
+---------------------------------------+
|                                     0 |
+---------------------------------------+
1 row in set (0.00 sec)

実行結果の解説

1つ目の例では、範囲の上限にあたる「2038-01-19 08:44:07」を指定しているため、32ビット整数の最大値である2147483647が返されています。

2つ目の例では、上限をわずか1秒超えた「2038-01-19 08:44:08」を指定した結果、0が返されました。同様に、3つ目の例では1970年以前の日時である「1969-01-01 05:10:00」を指定したため、こちらも0が返されています。

このように、UNIX_TIMESTAMP関数を使用する際は、TIMESTAMP型の有効範囲内の日時値を指定する必要がある点に注意しましょう。2038年以降の日時を扱う予定がある場合は、DATETIME型やBIGINT型のカラムと組み合わせるなど、別の設計を検討することをおすすめします。

  1. MySQLのINTERVAL()関数で第1引数にNULLを指定した場合の戻り値とは?

    INTERVAL()関数の第1引数がNULLだった場合の戻り値MySQLのINTERVAL()関数は、第1引数と残りの引数リストを比較し、第1引数の値がどこまで続く範囲に該当するかを示すインデックスを返す関数です。そして重要なポイントとして、第1引数にNULLを指定した場合、戻り値は必ず-1になります。実際の動作を以下の例で確認してみましょう。mysql> Select INTERVAL(NULL,20,32,38,40,50,55);+--------------------------------------+| INTERVAL(NULL,20,32,38,40,50,55)

  2. MySQLのDECIMAL(x,0)で扱える数値の範囲はどのくらい?

    MySQLでは、DECIMAL型はINTEGER型やBIGINT型よりも大きな数値を扱うことができます。BIGINTの場合、最大で18446744073709551615まで格納できますが、DECIMALではDECIMAL(65,0)を指定することで、65桁すべてが「9」の巨大な数値を保存することが可能です。DECIMAL(x,0)に必要なストレージ容量DECIMALは数値をバイト単位で格納しており、必要なストレージ容量は次の計算式で求められます。StorageRequirementInBytes = (x/9) + remaining; WHERE remaining = round_up(