MySQL TIMESTAMP表现得很奇怪

时间:2016-05-25 05:55:42

标签: android mysql sql

在我的聊天应用程序中,我在Android应用程序上使用System.currentTimeMillis()/1000将消息创建的时间发送到我的MySQL服务器,而没有毫秒部分。现在奇怪的是,我的表有两个具有相同毫秒值的记录。更奇怪的是,当我将毫秒转换为可读时间时,值完全不同! 以下是两个不同查询的输出:

SELECT max(UNIX_TIMESTAMP(created_at)), created_at, message FROM messages WHERE mtype = 0 AND groups_id = 1;

 max(UNIX_TIMESTAMP(created_at)) | created_at          | message |
+--------------------------------+---------------------+---------+
|                     1464096148 | 2016-04-25 13:57:18 | The   


SELECT UNIX_TIMESTAMP(created_at), created_at, MESSAGE FROM messages WHERE mtype = 0 AND groups_id = 1 ORDER BY created_at DESC LIMIT 1;

 max(UNIX_TIMESTAMP(created_at)) | created_at          | message |
+--------------------------------+---------------------+---------+
|                     1464096148 | 2016-05-24 18:52:28 | test   

上次查询的输出是我记得从我的客户端应用程序发送的内容。

2 个答案:

答案 0 :(得分:1)

没有什么表现得很奇怪,它的行为应该是应有的。

当你有一条以上的记录,而你正在使用像MAX()/MIN()/COUNT()...这样的聚合函数时,如果没有聚合函数的其他列具有不同的值,则会选择其中一条(不确定按什么顺序,我想是随意的。

因此,如果您希望它们返回相同的内容,那么您应该使用这个查询:

SELECT UNIX_TIMESTAMP(created_at), created_at, message FROM messages 
WHERE UNIX_TIMESTAMP(created_at) =(SELECT  max(UNIX_TIMESTAMP(created_at))
                                   FROM messages WHERE mtype = 0 AND groups_id = 1)
  and mtype = 0 AND groups_id = 1;

这将确保选择记录,其中时间戳等于最大时间戳,这将确保您选择正确的记录。处理聚合函数时,您必须为每列指定您想要的哪一个值。

答案 1 :(得分:0)

引用答案 -

  

它们代表从您的代码中有条件地引用的类,但在Android设备或模拟器上不存在,因为它们是在较新版本的Android中引入的。例如,在API Level 19(Android 4.4)中添加了ArrayMap。这些消息并不代表"崩溃"。

来源:Comment on the question