我有一个关于从日期表中获取不存在的日期的好、有效的方法的问题。
我有下面的日期表。用户将选择一个时间范围来“预订”可用地点(不完全是预订应用程序,但它很接近)。
我想我会检查用户选择的范围是否与表中显示的日期重叠。如果列位于 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/