UNIX_TIMESTAMP()
このコードが呼び出しごとに同じ値を返すのはなぜですか?
DECLARE myStamp1 FLOAT;
DECLARE myStamp2 FLOAT;
DECLARE n INT;
SET myStamp1 = UNIX_TIMESTAMP();
SELECT SLEEP(1) INTO n;
SET myStamp2 = UNIX_TIMESTAMP();
SELECT myStamp1, myStamp2;
UNIX_TIMESTAMP()
このコードが呼び出しごとに同じ値を返すのはなぜですか?
DECLARE myStamp1 FLOAT;
DECLARE myStamp2 FLOAT;
DECLARE n INT;
SET myStamp1 = UNIX_TIMESTAMP();
SELECT SLEEP(1) INTO n;
SET myStamp2 = UNIX_TIMESTAMP();
SELECT myStamp1, myStamp2;
データ型のFLOAT
仮数部は 23 ビットしかなく、これは基本的に 10 進数の 7 桁の精度に相当します。(はい、技術的には、制限はより正確に 6 桁で指定されています。) しかし、ポイントは、aFLOAT
が 7 桁以下の精度を表すことです。
そして現在、UNIX_TIMESTAMP()
関数は 10 桁の整数値を返しています。したがって、1 秒の変更は 10 番目 (最下位) の 10 進数のみを変更します (または 9 を 0 にロールオーバーします)。しかし、それだけでは FLOAT 値が異なるという結果にはなりません。(最終的に、FLOAT の値は変更されますが、1 秒の違いが異なる値になることはほとんどありませんFLOAT
。)
BIGINT
、DECIMAL(10,0)
またはTIMESTAMP
データ型を使用するDOUBLE
か、浮動小数点型のスケーラビリティが必要な場合は (?) を使用することをお勧めします。
<snip>
それぞれ現在の日付または時刻を返す関数は、クエリ実行の開始時にクエリごとに 1 回だけ評価されます。これは、1 つのクエリ内で NOW() などの関数を複数参照しても、常に同じ結果が生成されることを意味します。(ここでは、1 つのクエリには、ストアド プログラム (ストアド ルーチン、トリガー、またはイベント) への呼び出しと、そのプログラムによって呼び出されるすべてのサブプログラムも含まれます。) この原則は、CURDATE()、CURTIME()、UTC_DATE() にも適用されます。 、UTC_TIME()、UTC_TIMESTAMP()、およびそれらの同義語のいずれかに。
</snip>
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html
DECLARE
(ステートメントはストアド プログラム内でのみ有効であるため、表示するコードはストアド プログラム内にある必要があります。)