我试图通过使用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的间隔随着时间的推移而变化。可能是什么原因?
提前致谢,
答案 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
),可以再次评估。