[英]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.