【MySQL】UNIX_TIMESTAMP()・FROM_UNIXTIME()に範囲外の値を渡すと何が返される?
はじめに
MySQLには日付とタイムスタンプを相互に変換するための便利な関数が用意されています。しかし、これらの関数に対応範囲(有効な値の範囲)を超えた値を渡すと、エラーではなく特定の値が返される点に注意が必要です。本記事では、UNIX_TIMESTAMP()とFROM_UNIXTIME()それぞれの挙動の違いについて、実行例を交えて解説します。
UNIX_TIMESTAMP()に範囲外の値を渡した場合
UNIX_TIMESTAMP()関数に範囲外の値を渡すと、MySQLは0を返します。この関数で扱える有効な値の範囲は、TIMESTAMPデータ型と同じであり、「1970-01-01 00:00:01」UTCから「2038-01-19 03:14:07」UTCまでです。
実行例
1970年より前の日付を指定すると、結果として0が返されます。
mysql> Select UNIX_TIMESTAMP('1969-01-01 04:05:45');
+---------------------------------------+
| UNIX_TIMESTAMP('1969-01-01 04:05:45') |
+---------------------------------------+
| 0 |
+---------------------------------------+
1 row in set (0.00 sec)
FROM_UNIXTIME()に範囲外の値を渡した場合
FROM_UNIXTIME()関数に範囲外の値を渡すと、MySQLはNULLを返します。この関数で扱える有効な値の範囲は、INTEGERデータ型(符号付き32ビット整数)と同じであり、「-2147483648」から「2147483648」までです。
実行例
INTEGER型の上限である2147483648を超える値を指定すると、結果としてNULLが返されます。
mysql> Select FROM_UNIXTIME(2147483648); +---------------------------+ | FROM_UNIXTIME(2147483648) | +---------------------------+ | NULL | +---------------------------+ 1 row in set (0.00 sec)
両関数の挙動のまとめ
| 関数名 | 範囲外の値を渡したときの戻り値 | 有効な値の範囲 |
|---|---|---|
| UNIX_TIMESTAMP() | 0 | TIMESTAMPデータ型と同一 ('1970-01-01 00:00:01'〜'2038-01-19 03:14:07' UTC) |
| FROM_UNIXTIME() | NULL | INTEGERデータ型と同一 (-2147483648〜2147483648) |
このように、どちらの関数もエラーを発生させることなく処理が続行されるため、アプリケーション側では戻り値が0やNULLでないことを確認するなど、範囲チェックを行っておくことが推奨されます。
-
MySQLのINTERVAL()関数とは?構文と戻り値の仕組みを実例付きで解説
MySQLのINTERVAL()関数は、第1引数とそれ以降の複数の引数を比較し、「第1引数より大きい値」が最初に現れる位置(インデックス)を返す関数です。複数の閾値と一度に大小比較を行いたい場合などに活用できます。 INTERVAL()関数の構文 INTERVAL(N, N1, N2, N3, …) この関数は、第1引数であるNを、残りの引数であるN1、N2、N3…と順番に比較していきます。すべての引数は整数として扱われ、比較結果に応じて以下のような値を返します。 N < N1 の場合 → 0 を返す N < N2 の場合 → 1 を返す N < N3 の場合 → 2
-
MySQLストアドプロシージャから戻り値を返す方法
MySQLのストアドプロシージャから値を返したい場合、ユーザー定義のセッション変数を使用する必要があります。セッション変数を定義するには、変数名の先頭に「@」記号(アットマーク)を付けます。セッション変数の基本構文例えば、validoという変数に値を格納して参照する場合は、以下のように「@」を付けて記述します。SELECT @valido;SELECT文でセッション変数を使う場合も同様に、任意の変数名の前に「@」を付けます。基本構文は次のとおりです。SELECT @anyVariableName;戻り値を返すストアドプロシージャの作成例ここでは、実際にストアドプロシージャから値を返すデモを行い