检索具有最近(之前和之后)给定日期的记录

时间:2012-09-25 09:24:34

标签: php mysql

考虑具有给定字段的tasks表:

id | release_date | task_number
-------------------------------------
1  | 2012-09-01   | task_number#1
2  | 2012-09-07   | task_number#2
3  | 2012-09-11   | task_number#3
4  | 2012-09-05   | task_number#4
5  | 2012-09-21   | task_number#5
6  | 2012-09-31   | task_number#6

我想检索最接近(之前和之后)给定日期的记录。

我知道这可以通过使用两个单独的查询来完成。

但有没有办法检索single mysql query中最近的记录?

例如,如果给定日期为2012-09-11,则输出应为:

    id | release_date | task_number
    -------------------------------------
    2  | 2012-09-07   | task_number#2
    3  | 2012-09-11   | task_number#3
    5  | 2012-09-21   | task_number#5

2 个答案:

答案 0 :(得分:1)

以下应该是我认为的技巧 - 它按顺序使用timeDiff

select 
    id, 
    release_date, 
    task_number 
from 
    tasks 
order by 
    abs(timediff('2012-09-11',release_date)) desc

您可以使用您在PHP连接中作为参数输入的值,如下所示:

select 
    id, 
    release_date, 
    task_number 
from 
    tasks 
order by 
    abs(timediff(:yourDate,release_date)) desc

并以相同的yyyy-mm-dd格式将字符串传递给它。

编辑:来自下方的有趣评论,看起来准确无误 - 但是以下应该可以解决这个问题:

select 
    id, 
    release_date, 
    task_number 
from 
    tasks 
order by 
    abs(time_to_sec(timediff('2012-09-11',release_date))) desc

答案 1 :(得分:0)

如果你有release_date索引,你可以这样做以获得更好的性能。

select 
    id, 
    release_date, 
    abs( datediff(release_date,"$the_date") ) as sort_key
from tasks
where 
    id = (select id from tasks where release_date > "$the_date" order by created_time limit 1)      
    or 
    id = (select id from tasks where release_date < "$the_date" order by created_time desc limit 1) 
order by sort_key limit 1;

第一个子查询将在$ the_date之后找到第一个日期的ID,第二个子查询将在$ the_date之前找到最后日期的ID,之后,我们可以轻松地选择愿望日期。