Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.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 从日期表中获取最接近时间范围的算法或SQL_Php_Mysql_Sql - Fatal编程技术网

Php 从日期表中获取最接近时间范围的算法或SQL

Php 从日期表中获取最接近时间范围的算法或SQL,php,mysql,sql,Php,Mysql,Sql,我有一个问题,关于一个好的、有效的方法,从日期表中获取不存在的日期 我有下面的日期表。用户将选择一个时间范围来“预订”一个可用的地点(不完全是预订应用程序,但它接近于此) 我想我会检查用户选择的范围是否与表中的日期重叠。如果列在startRange和endRange之间,我将进行某种选择计数。那不是我的主要问题。。。如果没有任何重叠,我将插入新的时间范围 我的问题是如何在用户选择的相同持续时间内获得最接近的可用时间范围 例如,用户选择startDate=2013-12-30 11:00:00和e

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

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

我想我会检查用户选择的范围是否与表中的日期重叠。如果列在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 这样我就知道了时间顺序范围之间的间隔持续时间

公共函数getFechasCercanas(){
$tiemposCercanos=$this->selectCercanos();
$res=$this->selectCercanos();
$tmp=null;
foreach($res作为$row){
如果($tmp==null){
$tmp=$row;
继续;
}
$dt1=新日期时间($tmp['endRange']);
$dt2=新日期时间($row['startRange']);
$interval=$dt1->diff($dt2);
$interval->format(“%H horas”)。“\n”;
回音“从:.$tmp['endRange']”到:.$row['startRange']”。失效:“。
$interval->格式(“%y年%m月%d天%H小时”)。“\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)等于请求的间隔的行,并按请求的开始时间和行的开始时间之间的差值的绝对值排序,最小差值为第一行,最大差值为四行

注:

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

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


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

您是否尝试过有效的方法?让代码运行良好的第一步是让代码正常工作。感谢您的回复。不,我什么都没试过,因为我不知道如何解决这个问题。多亏了下面的帖子,我现在知道了怎么做。你有没有试着到处找以前问过这个问题的人?比如,“mysql如何选择日期范围”?可能是重复的,我做了。我正在寻找一种方法来找出数据库中的差距,而不是数据库中的范围。谢谢Kielni。我更新了帖子。我认为我不需要where子句,因为我不想得到具有相同持续时间的范围。我想知道他们之间的差距。
select id, startRange, endRange from table_name_here 
where (tstEnd-tstStart)=(1388397600-1388394000) 
order by abs(1388394000-tstStart) asc limit 4;