【问题标题】:MySQL TIMESTAMP behaving weirdlyMySQL TIMESTAMP 行为怪异
【发布时间】:2016-05-25 05:55:42
【问题描述】:

在我的聊天应用程序中,我在 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   

最后一个查询的输出是我记得从我的客户端应用程序发送的内容。

【问题讨论】:

  • 这里没看出有什么问题,应该不一样吧,你在第一个查询中选择了max一个,大概属于2016-05-24
  • @sagi 请看第一列的毫秒值,它们完全一样。然后检查第二列是否完全不同。
  • 他们为什么不呢?您有不止一条记录,因此当您选择 MAX() 时,它将选择最大时间戳!其他没有 group by 子句和聚合函数的列将被随机选择
  • @sagi 你在说第一个查询吗?
  • @sagi 别在意我的最后评论,你是对的。我不知道 SQL 的这种行为。你能指导我做出正确的查询以显示正确的结果吗?

标签: android mysql sql


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

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

【讨论】:

  • 谢谢!我一定是疯了才能尝试选择这样的东西。随机选择第二列的 SQL 查询(可能)是让我发疯的原因。你介意我删除这个问题吗?
  • 没问题,没关系,随心所欲。 @AkashAggarwal
  • 我以为我在树立一个坏榜样,但一个坏榜样也是一个好榜样。我想为阅读此问题的任何人补充一点,您不需要在 WHERE 条件的任一侧调用 UNIX_TIMESTAMP() 函数。
【解决方案2】:

引用答案-

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

来源:Comment on the question

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    • 2012-08-05
    • 2012-12-03
    相关资源
    最近更新 更多