簡體   English   中英

檢索具有最近(之前和之后)給定日期的記錄

[英]Retrieving records with the closest (before and after) given date

考慮具有給定字段的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

以下應該做我認為的技巧 - 它按順序使用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格式將字符串傳遞給它。

編輯:下面的chops有趣的評論,似乎准確的點 - 但以下應該做的解決方法:

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

如果你有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,之后,我們可以輕松地選擇期望日期。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM