UNIX_TIMESTAMP返回0

时间:2012-06-17 15:38:51

标签: mysql

我试图通过使用unix_timestamp函数返回值,但它表现得很奇怪。

set @currentdate:= UNIX_TIMESTAMP(NOW() + 1000) /* 1339947588 */
set @currentdate:= UNIX_TIMESTAMP(NOW() + 2000) /* 1339948188 */
set @currentdate:= UNIX_TIMESTAMP(NOW() + 3000) /* 1339948788 */

set @currentdate:= UNIX_TIMESTAMP(NOW() + 4000) /* 0 */
set @currentdate:= UNIX_TIMESTAMP(NOW() + 5000) /* 0 */
set @currentdate:= UNIX_TIMESTAMP(NOW() + 6000) /* 0 */
set @currentdate:= UNIX_TIMESTAMP(NOW() + 7000) /* 0 */

set @currentdate:= UNIX_TIMESTAMP(NOW() + 8000) /* 1339949388 */
set @currentdate:= UNIX_TIMESTAMP(NOW() + 9000) /* 1339949988 */
set @currentdate:= UNIX_TIMESTAMP(NOW() + 10000) /* 1339950588 */

为什么它为4000-7000之间的值返回0的值?

我看到的答案与当前时间有关,因为给出0的间隔随着时间的推移而变化。可能是什么原因?

提前致谢,

2 个答案:

答案 0 :(得分:4)

这一点都不奇怪。在对结果调用NOW()之前,您要在UNIX_TIMSETAMP()的结果中添加一些数字。我想您希望在添加您的值之前致电UNIX_TIMESTAMP

UNIX_TIMESTAMP(NOW()) + 4000

或只是

UNIX_TIMESTAMP() + 4000

这两个都会将4000 添加到当前时间。另一种解决方案是使用INTERVAL关键字将时间单位添加到日期:

NOW() + INTERVAL 4000 SECOND

根据the manual,在评估NOW() + 4000时,NOW()会返回以下格式的数字:YYYYMMDDHHMMSS.uuuuuu,例如20071215235026.000000。如果你向它添加4000,你可能会或可能不会得到类似于真实日期的东西。如您所见,您将添加秒或任何其他已定义的实体。如果您获得正确的日期UNIX_TIMESTAMP将返回时间戳,否则它将返回0

答案 1 :(得分:2)

以这种方式使用NOW()进行测试可能会导致令人困惑的结果。所以我们把它放到一个变量中:

SET @now=NOW();

我们来看看它:

SELECT @now;
-> 2012-06-17 17:42:01

嗯。也许我们想在数字语境中使用它?

SET @now=NOW()+0;
SELECT @now;
-> 20120617174201
SELECT UNIX_TIMESTAMP(@now);
-> 1339947721

啊哈。那是什么?这是当前的日期和时间。 2012-06-17 17:42:01及其UNIX时间戳。

现在?

SELECT @now + 2000;
-> 20120617176201
SELECT UNIX_TIMESTAMP(@now + 2000);
-> 0

根据上面的逻辑,它代表2012-06-17 17:62:01。这是无效的,这会使UNIX_TIMESTAMP()发牢骚。

但是,如果我们这样做,

SELECT @now + 7000;
-> 20120617181201
SELECT UNIX_TIMESTAMP(@now + 7000);
-> 1339949521

我们达到了一段有效时间(2012-06-17 18:12:01),可以再次评估。