【问题标题】:MySQL comparing date from unix timestampMySQL比较来自unix时间戳的日期
【发布时间】:2013-04-26 07:21:12
【问题描述】:

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

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

【问题讨论】:

  • 数据库中last_activity的字段类型和值是什么?
  • INT(10) 值为 1367481523,我使用在线工具进行了快速转换,时间戳代表正确的日期..

标签: mysql datetime unix-timestamp


【解决方案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)

;-)

【讨论】:

  • 嗯...这很奇怪,看看使用工作台的查询截图img199.imageshack.us/img199/9482/sql.PNG
  • 我现在完全迷失了 unix 时间格式。在一遍又一遍地阅读您的建议后,我找到了解决方案。不过谢谢。
猜你喜欢
  • 2021-03-31
  • 2011-03-23
  • 2013-03-02
  • 1970-01-01
  • 2018-12-27
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
相关资源
最近更新 更多