5

我正在尝试使用 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 的间隔会随着时间的推移而变化。可能是什么原因?

提前致谢,

4

2 回答 2

3

这一点也不奇怪。NOW()在调用结果之前,您要在结果中添加一些数字UNIX_TIMSETAMP()。我认为您想在 添加值UNIX_TIMESTAMP 之前调用:

UNIX_TIMESTAMP(NOW()) + 4000

要不就

UNIX_TIMESTAMP() + 4000

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

NOW() + INTERVAL 4000 SECOND

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

于 2012-06-17T15:44:38.453 回答
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可以再次评估的有效时间范围( )。

于 2012-06-17T15:47:50.977 回答