【问题标题】:Sql date select rows within X seconds range of each otherSql日期选择彼此X秒范围内的行
【发布时间】:2009-05-08 09:35:42
【问题描述】:

我的 sql 表类似于 (message,created)

我想选择彼此相距 X 秒内的那些行。假设最后一条消息在 NOW() 的 X 秒内,那么它应该选择它。如果倒数第二条消息在最后一条消息的 X 秒内,那么它也应该选择它。换句话说,每一行都应该与下一行进行比较并检查。对于最后一行,应使用 NOW() 进行检查。基本上我想要最后一个消息会话(即我们相互链接的最后一组消息,假设 X 秒内的后续消息相互链接)

我不知道如何为此编写 SQL 查询。有没有可能?

非常感谢您的宝贵时间。

【问题讨论】:

    标签: mysql date time logic


    【解决方案1】:

    此脚本适用于 SQLServer。您应该可以取出 select 语句并在 MySQL 中运行它。

    DECLARE @Messages TABLE (Message VARCHAR(10), Created DATETIME)
    DECLARE @Interval FLOAT
    
    -- Interval is 1 day.
    SET @Interval = 1
    
    -- These should be in result
    INSERT INTO @Messages VALUES ('Message1', GetDate())    
    INSERT INTO @Messages VALUES ('Message2', GetDate()-1)
    -- These should not be in result
    INSERT INTO @Messages VALUES ('Message3', GetDate()-3)
    INSERT INTO @Messages VALUES ('Message4', GetDate()-5)
    
    SELECT m1.Message, m1.Created
    FROM @Messages m1
         INNER JOIN @Messages m2 ON m2.Created <= m1.Created + @Interval                                
                                    AND m2.Created >= m1.Created
                                    AND m2.Message <> m1.Message
    UNION ALL SELECT m2.Message, m2.Created
    FROM @Messages m1
         INNER JOIN @Messages m2 ON m2.Created <= m1.Created + @Interval                                
                                    AND m2.Created >= m1.Created
                                    AND m2.Message <> m1.Message
    ORDER BY Created
    

    【讨论】:

    • 你能给我解释一下吗?连接的每个部分到底在做什么?
    • @Alec Smart,别提了。很高兴你明白了,我已经在“试图”解释加入,但很难理解。 (英语不是我的母语)
    • 这基本上在 postgresql 中也可以工作,对语法进行了一些调整。
    【解决方案2】:

    我相信你的想法太复杂了(但话说回来,也许我误解了要求?)

    这会选择在特定消息之前 30 秒内创建的所有消息:

    SELECT
      Id,
      MessageText,
      MessageDate
    FROM
      Message
    WHERE
      TIME_TO_SEC(TIMEDIFF(
        (
          SELECT MessageDate 
          FROM   Message
          WHERE  Id = 17
        ),
        MessageDate
      )) <= 30
    

    其中 17 当然是您感兴趣的消息 Id,30 是您的时间范围内的秒数。

    【讨论】:

    • 应该是 30 秒之内...而不是单个消息。
    • 您如何看待结果? “SELECT * FROM Messages WHERE {它们相距 30 秒}”会是什么样子?
    猜你喜欢
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    相关资源
    最近更新 更多