MySQL比较unix时间戳的日期

时间:2013-05-02 07:32:29

标签: mysql datetime unix-timestamp

所以我有一个会话表,其实质上有以下cols:

session_id | user_agent | last_activity(在unix时间戳中)

当我尝试使用此查询显示5分钟前创建的会话中的session_id和last_activity时

SELECT session_id, from_unixtime('last_activity' / 1000, '%Y-%m-%d %H:%i') AS session_time
FROM gw_sessions
WHERE last_activity >= unix_timestamp(CURRENT_TIMESTAMP - INTERVAL 5 MINUTE) * 1000

它不起作用。

所以我试图通过使用以下查询显示所有会话(session_id和last_activity)来简化我的查询

SELECT session_id, from_unixtime('last_activity' / 1000, '%Y-%m-%d %H:%i') AS session_time
FROM gw_sessions

结果显示如下

session_id | session_time
abcdefg... --> 1970-01-01 07:00 (epoch)

为什么它没有正确转换值?如何将两个日期(now())与以unix格式存储的日期正确比较?

1 个答案:

答案 0 :(得分:1)

您的查询正在返回正确的信息。看看:

SELECT (1367481523) a, (unix_timestamp(CURRENT_TIMESTAMP - INTERVAL 5 MINUTE) * 1000) b;
+------------+---------------+
| a          | b             |
+------------+---------------+
| 1367481523 | 1367483902000 |
+------------+---------------+

正如您所说,您的last_activity是'a'值。它比'b'小。在您的查询中,您希望所有记录都带有'a'> ='b'(WHERE last_activity> = unix_timestamp ...)。

到目前为止,您的查询是正确的。也许你的逻辑是需要改变的。

[编辑]

然后,再次检查您要比较的值带来的返回日期。

mysql> SELECT 
     from_unixtime(1367481523 / 1000, '%Y-%m-%d %H:%i') a, 
     from_unixtime(1367483902000 / 1000, '%Y-%m-%d %H:%i') b;
+------------------+------------------+
| a                | b                |
+------------------+------------------+
| 1970-01-17 05:51 | 2013-05-02 18:38 |
+------------------+------------------+
1 row in set (0.00 sec)

- )