首页 > 解决方案 > 如何围绕另一条记录的时间戳选择记录?

问题描述

在这个问题上敲我的脑袋:我需要在 n 分钟内向上或向下选择“附近”另一条记录的时间戳的所有记录。我看到的示例使用 NOW() 但我遇到的问题是我需要使用记录的时间戳而不是当前时间。例子:

ID      timestamp
851     2020-04-17 12:56:02     
850     2020-04-17 09:40:01     
849     2020-04-17 09:39:02     
848     2020-04-17 09:39:01     
847     2020-04-17 09:36:02     
**846   2020-04-17 09:36:02**   
845     2020-04-17 09:36:02     
844     2020-04-17 09:36:01     
843     2020-04-17 09:36:01     
842     2020-04-17 09:31:01     
841     2020-04-17 09:11:02     
840     2020-04-16 22:13:02     

假设我将使用记录 ID 846 作为主时间戳,并希望在 5 分钟内获取它周围的所有记录,我期待的结果应该是:850 到 842,不包括 851 和 841、840。我到底怎么能做到这一点? :)


所以最后,为了在一分钟内得到这些记录,我用这个得到了一些东西(我会知道哪个记录ID将用作查找附近记录的主要点):

SELECT
    Id, 
    date_in,
FROM t 
WHERE (TIMESTAMPDIFF(MINUTE, date_in,
                        (SELECT date_in FROM t WHERE Id = 846)
                    ) = 0 
       )
ORDER BY Id DESC LIMIT 20

ID      timestamp
847     2020-04-17 09:36:02
**846   2020-04-17 09:36:02**
845     2020-04-17 09:36:02
844     2020-04-17 09:36:01
843     2020-04-17 09:36:01

标签: mysql

解决方案


因此,要使用大于 1 分钟的范围,我想出了这个,效果很好,但我不知道是否是正确的方法。这是以一个人的时间戳为起点,在 20 分钟内选择记录:

SELECT
    Id, 
    date_in,
FROM t 
WHERE (TIMESTAMPDIFF(MINUTE, date_in,
                        (SELECT date_in FROM t WHERE Id = 846)
                    ) = < 20 
       )
       AND
       (TIMESTAMPDIFF(MINUTE, date_in,
                        (SELECT date_in FROM t WHERE Id = 846)
                    ) = > -20 
       )
ORDER BY Id DESC LIMIT 20

ID      timestamp
850     2020-04-17 09:40:01     
849     2020-04-17 09:39:02     
848     2020-04-17 09:39:01     
847     2020-04-17 09:36:02     
**846   2020-04-17 09:36:02**   
845     2020-04-17 09:36:02     
844     2020-04-17 09:36:01     
843     2020-04-17 09:36:01     
842     2020-04-17 09:31:01         

推荐阅读