连续调用时重复MySQL UNIX_TIMESTAMP()结果

时间:2012-12-14 21:10:14

标签: mysql

为什么此代码会为每次调用返回相同的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;

1 个答案:

答案 0 :(得分:2)

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

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

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


摘自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语句仅在存储的程序中有效。)