0

所以我有一个会话表,它本质上具有以下列:

session_id | 用户代理 | 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 格式正确存储的日期进行比较?

4

1 回答 1

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)

;-)

于 2013-05-02T08:46:19.843 回答