【问题标题】:UPDATE column where timediff is greater than 5 minutestimediff 大于 5 分钟的 UPDATE 列
【发布时间】:2017-08-07 11:31:31
【问题描述】:

我有一个表(会话),其中有 2 列我必须用于此查询。 Session_Active(一个 tinyInt)和 Last_active(一个 datetime)。

我想创建一个查询,计算所有表的现在和“Last_active”之间的时间差,其中“Session_Active”为真,如果大于 5 分钟,则应更改“Session_Active”。

这是我所拥有的部分:

SELECT timediff(now(), `Last_Active`) from sessions WHERE `Session_Active` = true;

我完全不知道如何检查差异是否大于 5 分钟,我也不知道将 UPDATE Session_Active = false 放在哪里/如何放置(如果差异大于或等于 5 分钟)

提前致谢! (:

【问题讨论】:

    标签: mysql session


    【解决方案1】:

    您可以通过DATE_SUB 使用以下解决方案:

    UPDATE sessions SET `Session_Active` = 0
    WHERE `Last_Active` <= DATE_SUB(NOW(), INTERVAL 5 MINUTE)
        AND `Session_Active` = 1
    

    您想使用时间戳解决方案吗?

    你可以使用TIMESTAMPDIFF:

    UPDATE sessions SET `Session_Active` = 0
    WHERE TIMESTAMPDIFF(MINUTE, `Last_Active`, NOW()) >= 5
        AND `Session_Active` = 1
    

    注意:你应该小心使用TIMESTAMP!为什么不应该使用TIMESTAMP 的一些信息:https://stackoverflow.com/a/35469149/3840840。在这个答案中,引用了 this article,描述了 DATETIMETIMESTAMPINT 的性能。

    TIMESTAMP 解决方案仅在 2038 年之前有效。这将由 Year 2038 problem 引起。

    很好地解释了这个问题以及 2038 年发生的事情:https://stackoverflow.com/a/2012620/3840840

    【讨论】:

    • 这个答案对我有用,我只需将 MINUTES 更改为 MINUTE。也许 MINUTES 用于旧的 mysql 版本?
    • @JeroenM - 没错,我的错。我还添加了一个简单的时间戳解决方案。
    • 谢谢!既然 2038 年还很遥远,为什么还要使用时间戳解决方案呢?
    • 目前它正在工作,应该不会造成任何问题。这将是 21 年(很长一段时间)后的问题。一个非常好的解释 2038 年发生的事情:stackoverflow.com/a/2012620/3840840
    【解决方案2】:

    您可以使用UNIX_TIMESTAMP(date)

    当使用日期参数调用 UNIX_TIMESTAMP() 时,它会以自 '1970-01-01 00:00:00' UTC 以来的秒数返回参数的值。 date 参数可以是 DATE、DATETIME 或 TIMESTAMP 字符串,或 YYMMDD、YYMMDDHHMMSS、YYYYMMDD 或 YYYYMMDDHHMMSS 格式的数字。服务器将日期解释为当前时区的值,并将其转换为 UTC 的内部值。 这比大型表集上的 DATE_SUB 更快。

    UPDATE sessions 
     SET `Session_Active` = 0
      WHERE UNIX_TIMESTAMP(now()) - UNIX_TIMESTAMP(`Last_Active`) > 300
      AND `Session_Active` = 1
    

    【讨论】:

    • 谢谢,这个答案也有效。在我接受另一个之后几秒钟,你用一个很好的解释更新了你的答案。从长远来看,桌子集确实可能会变得很大,所以这就是为什么这个答案对我来说比另一个更有用,尽管也很欣赏塞巴斯蒂安的回答。谢谢你们俩(:
    • @Anril - 很难相信将DATETIME 转换为TIMESTAMP 并计算后比DATE_SUB 更快。请参阅以下答案:stackoverflow.com/a/35469149/3840840。你能展示一些基准来证实这一点吗? - 这个解决方案只在 2038 年之前有效! DATE_SUB 工作到 9999 年。
    • @SebastianBrosch,我在查询中使用感知(也基于经验)“避免功能”,你对 Unix Millennium 问题有一个强项,你的答案现在无疑比我更合适 + 1 来自我。
    • @Anil - thx ;) - 我不想将您的解决方案称为糟糕的解决方案,但它还没有为未来做好准备。它现在有效,并且在 10 年内有效,这不是问题。到 2038 年还有很长的路要走:D
    • @JeroenM,您应该接受塞巴斯蒂安的回答,也会使用。我的还没有为未来做好准备。我不会删除我对塞巴斯蒂安关于“Unix 千年问题”的非常有价值的评论的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    相关资源
    最近更新 更多