4

为什么这段代码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;
4

1 回答 1

2

FLOAT数据类型的尾数只有 23 位,基本上相当于 7 个十进制数字的精度。(是的,从技术上讲,该限制更准确地指定为六位数字。)但重点是 aFLOAT表示不超过七位十进制数字的精度。

现在,UNIX_TIMESTAMP()函数正在返回一个十进制数字的整数值。因此,一秒钟的更改将仅更改第 10 个(最低位)十进制数字(或将 9 翻转为 0)。但这还不足以产生不同的 FLOAT 值。(最终,FLOAT 的值会发生变化,但任何一秒的差异都不太可能导致不同的FLOAT值。)

我建议您尝试使用BIGINT,DECIMAL(10,0)TIMESTAMP数据类型,或者DOUBLE如果需要(?)浮点类型的可伸缩性,请使用 a 。


摘自 MySQL 文档

<snip>

每个返回当前日期或时间的函数在查询执行开始时每个查询只计算一次。这意味着在单个查询中多次引用诸如 NOW() 之类的函数总是会产生相同的结果。(为了我们的目的,单个查询还包括对存储程序(存储例程、触发器或事件)的调用以及该程序调用的所有子程序。)这个原则也适用于 CURDATE()、CURTIME()、UTC_DATE() 、UTC_TIME()、UTC_TIMESTAMP() 以及它们的任何同义词。

</snip>

http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

(您显示的代码必须在存储程序中,因为该DECLARE语句仅在存储程序中有效。)

于 2012-12-14T21:18:56.347 回答