php - 从日期表中获取最接近可用时间范围的算法或 SQL

标签 php mysql sql

我有一个关于从日期表中获取不存在的日期的好、有效的方法的问题。

我有下面的日期表。用户将选择一个时间范围来“预订”可用地点(不完全是预订应用程序,但它很接近)。

我想我会检查用户选择的范围是否与表中显示的日期重叠。如果列位于 startRange 和 endRange 之间,我将进行某种选择计数。这不是我的主要问题...如果没有任何重叠,我将插入新的时间范围。

我的问题是如何在用户选择的相同持续时间内获得最接近的可用时间范围。

例如,用户选择 startDate = 2013-12-30 11:00:00 和 endDate = 2013-12-30 12:00:00。

id  startRange          endRange            tstStart   tstEnd
1   2013-12-30 11:00:00 2013-12-30 12:00:00 1388394000  1388397600
2   2013-12-30 14:00:00 2013-12-30 15:00:00 1388408400  1388412000
3   2013-12-30 16:00:00 2013-12-30 17:00:00 1388408400  1388412000
4   2013-12-30 18:00:00 2013-12-30 19:00:00 1388422800  1388426400
5   2013-12-30 22:00:00 2013-12-30 23:00:00 1388437200  1388440800

And the desired output would be something like this (we only show the four closests available time ranges):

From 2013-12-30 12:00:00 to 2013-12-30 13:00:00
From 2013-12-30 13:00:00 to 2013-12-30 14:00:00
From 2013-12-30 15:00:00 to 2013-12-30 16:00:00
From 2013-12-30 17:00:00 to 2013-12-30 18:00:00

Thanks to Kielni I come have a slight Idea of how to aproach the problem. This code gets the closest time ranges to the one the user chooses.

Here's some php:

public function selectCercanos(){
    $rangeStart = 1388394000;
    $rangeEnd = 1388397600;
    $dif = $rangeEnd - $rangeStart;

    $sql = 'select p.startRange, p.endRange, p.tstIni, p.tstEnd from TimeRanges p
        order by abs(p.tstIni-:rangeStart) asc limit 4;';
    $params = array (
            ':rangeStart' => $rangeStart
        );

    return $this->find ( $sql, $params ); //PDO method
}

这样我就知道订购时间范围之间的间隙持续时间

public function getFechasCercanas(){
    $tiemposCercanos = $this->selectCercanos();
    $res = $this->selectCercanos();
    $tmp = null;
    foreach($res as $row){
        if($tmp == null){
            $tmp = $row;
            continue;
        }
        $dt1 = new DateTime($tmp['endRange']);
        $dt2 = new DateTime($row['startRange']);
        $interval = $dt1->diff($dt2);
         $interval->format('%H horas')."\n";
        echo "from: ".$tmp['endRange']. " to: ".$row['startRange']. " lapse: ".
             $interval->format('%y years %m months %d days %H hours')."\n";

        $tmp = $row;
    } 
}

上面的代码得到了我想要的。我想知道是否有任何算法或好的查询可以更有效地找到相同的结果?

我希望问题比以前更清楚一点,并且我更好地理解我的问题。

最佳答案

您可以选择结束时间和开始时间之间的差值与您的时间间隔相匹配的行,并按所需的开始时间和该行的开始时间之间的差值进行排序。

例如:

select id, startRange, endRange from table_name_here 
where (tstEnd-tstStart)=(1388397600-1388394000) 
order by abs(1388394000-tstStart) asc limit 4;

英文: 选择间隔 (tstEnd-tstStart) 等于您请求的间隔的行,并按您请求的开始时间与该行的开始时间之间的差值的绝对值进行排序,最小差值在前,最多四行。

注释:

使用整数比使用日期更容易;我看到您已经在表中存储了一个整数时间戳。也将您的请求开始/结束转换为整数。对于此示例,请求的 start=1388394000 和请求的 end=1388397600

为了便于解释,我有(tstEnd-tstStart)=(1388397600-1388394000),但为了提高效率,您应该计算您请求的间隔(1388397600-1388394000)在代码中一次而不是在每一行中一次。

确保使用占位符,而不是将值直接粘贴到查询字符串中。

关于php - 从日期表中获取最接近可用时间范围的算法或 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20840977/

相关文章:

java - 人类友好的唯一 URL

Android SQLite 到我的 MySQL Web 服务器?

python - 如何使用python语句检查sql表是否存在?

sql - Snowflake SQL group-by 的行为有所不同,具体取决于列是按位置引用还是按别名引用

php - Wordpress - 如果当前页面处于事件状态,则添加 "active"类

php - SAAS - Laravel - Multi-Tenancy - 切换数据库

mysql - SQL 查询返回查询中的最高日期值

SQL 提示在执行前将整个表加载到 RAM 中?

php - 使用 Predis 使用 Laravel-5.4.32 配置 AWS ElasticCache redis Cluster-3.2.4

php - 如何通过phpMyAdmin连接到mysql docker容器?