首页 文章

在mysql查询中查找与指定日期时间最接近的日期时间

提问于
浏览
9

我试图在mysql数据库中找到一个datetime值,它与我指定的日期时间最接近,我遇到了一些麻烦 .

以下伪代码是我想要实现的:

SELECT one FROM table WHERE datetimefield is closest to "2014-12-10 09:45:00" LIMIT 1

提前致谢

EDIT

感谢到目前为止的回复,因为事实证明查询比我最初想到的更复杂一点,以获得所需的结果,ABS方法适用于一些添加 .

接下来的问题是,是否有降低以下查询的性能要求?

SELECT DISTINCT timegenerated, *other values*  
FROM table1 e INNER JOIN table2 dt
ON e.circuit = dt.circuit 
WHERE dt.circuit IN ("2", "3", "4", "5", "6", "7", "8") 
AND e.circuit != 1
AND dt.siteid = 435 
ORDER BY ABS(TIMESTAMPDIFF(MINUTE, timegenerated, "2014-12-09 14:15:00")) LIMIT 7

或者将其合并以匹配多个日期,因为我需要能够匹配多个特定日期时间(可能多达90天)它当前正在从另一个阵列运行每个单独的日期时间但我意识到这不是最佳的 . 该查询是在PHP中动态构建的 .

查询时间目前约为每个查询1.1秒,因此运行30次或更多次会产生问题,该表有数十万行 .

非常感谢!

3 回答

  • 26

    使用ABS()

    SELECT one FROM table 
    ORDER BY ABS(`datetimefield` - '2014-12-10 09:45:00') LIMIT 1
    

    这将返回具有最小差异的行,即最接近的行 .

  • 4

    关键的想法是使用 order bylimit

    如果你想要最近的一个:

    SELECT one
    FROM table
    WHERE datetimefield <= '2014-12-10 09:45:00'
    ORDER BY datetimefield DESC
    LIMIT 1;
    

    如果你想在任一方向上最接近,那么使用 TIMESTAMPDIFF()

    ORDER BY abs(TIMESTAMPDIFF(second, datetimefield, '2014-12-10 09:45:00'))
    LIMIT 1
    
  • 3

    使用abs()可以防止使用datetimefield索引 . 我建议有一个选择最近的前一个和一个选择最近的后,使用索引,然后选择最接近的:

    create table `table` (datetimefield datetime key, one varchar(99));
    insert into `table` values
      ('2014-06-01', 'a'), ('2014-12-01', 'b'),
      ('2015-01-01', 'c'), ('2015-02-01', 'd');
    
    set @d = '2014-12-10 09:45:00';
    
    select * from
    (
      ( select *, TIMESTAMPDIFF(SECOND, @d, datetimefield) as diff
        from `table` where datetimefield >= @d
        order by datetimefield asc  limit 1
      )
      union
      ( select *, TIMESTAMPDIFF(SECOND, datetimefield, @d) as diff
        from `table` where datetimefield < @d
        order by datetimefield desc limit 1
      )
    ) x
    order by diff
    limit 1;
    

    http://sqlfiddle.com/#!2/bddb4/1

相关问题