2013-05-02 91 views
0

所以我有这在本质上具有以下的cols会话表:MySQL的比较,从Unix时间戳日期

SESSION_ID | user_agent | last_activity(在UNIX时间戳)

当我试图从创建5分钟前使用此查询

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。

所以我想只要使用下面的查询显示所有会话(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格式存储的日期进行比较?

+0

有什么字段的数据库类型和last_activity的价值? – medina 2013-05-02 07:37:54

+0

INT(10)的值为1367481523,我做了一个使用在线工具的快速转换,时间戳表示正确的日期.. – Jeremy 2013-05-02 08:06:18

回答

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) 

;-)

+0

嗯......这是非常奇怪的,看看使用工作台HTTP查询屏幕截图:/ /img199.imageshack.us/img199/9482/sql.PNG – Jeremy 2013-05-03 03:21:41

+0

伴侣,请检查我的版本。 – medina 2013-05-03 03:52:33

+0

现在我完全失去了Unix的时间格式。尽管一遍又一遍地阅读你的建议后,我找到了解决方案。谢谢。 – Jeremy 2013-05-03 04:11:28