Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 检索最接近给定日期(之前和之后)的记录_Php_Mysql - Fatal编程技术网

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函数来组合具有两种不同条件的记录。