3

考虑一个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

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

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

但是有什么方法可以检索 a 中最近的记录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
4

2 回答 2

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
于 2012-09-25T09:27:50.170 回答
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,之后我们可以轻松选择想要的日期。

于 2012-09-25T09:57:26.053 回答