Php 检索最接近给定日期(之前和之后)的记录
考虑具有给定字段的任务表:Php 检索最接近给定日期(之前和之后)的记录,php,mysql,Php,Mysql,考虑具有给定字段的任务表: 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_numbe
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
我想检索与给定日期前后最接近的记录
我知道这可以通过使用两个单独的查询来完成
但是有没有办法在一个mysql查询中检索最近的记录
例如,如果给定日期为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
我认为,下面的方法应该可以做到这一点——它按顺序使用:
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
如果您在发布日期有索引,您可以这样做以获得更好的性能
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,之后,我们可以轻松地选择所需日期。在我的初始测试中,对timediff调用的结果调用abs,结果总是返回相同的值,而不管输入是什么:8385959.000000。试试看:选择absTIMEDIFF'2010-12-3123:59:59.000001'、'2008-12-3011:01:01.000002'@是的,我确实觉得很有趣。基于这一点,似乎有一个简单的解决方法:我相信我们必须使用datediff而不是timediff。我也尝试过修改它,但它仍然返回所有的行,而不是前一行和前一行after@BPRAMdateDiff将只返回天内的差值,因此我使用了timediff来提供更准确的顺序,但是如果您的数据仅基于日期,它很可能会起到一种魅力:@Fluffeh ya我明白您的意思了。问题是它没有给我想要的输出。因此,我决定使用UNION ALL函数来组合具有两种不同条件的记录。