我有两个问题。我的第一个问题是检查材料的可用性,这也是我现在遇到的主要问题。它将选择一次保留的所有材料。 所以我有schedule_dummy表的这个表日期: 注意:我正在使用codeigniter。
CREATE TABLE schedule_dummy
(
`materialID` int,
`date_reserve` date,
`start_time` time,
`end_time` time
);
------DB Table schedule_dummy --------
materialID | date_reserve | start_time | end_time
----------------------------------------------------------
7 | 2013-08-31 | 13:00:00 | 13:30:00
8 | 2013-08-31 | 13:00:00 | 14:00:00
----------------------------------------------------------
我的第二个查询是检索从第一个查询中检索到的id中的材料where_not_in。我有材料表的这个表日期:
------DB Table materials--------
id | cid | mname | mdesc
----------------------------------------------------------
7 | 1 | accer | acer
10 | 1 | scanner | scanner
12 | 1 | prjector | scanner
----------------------------------------------------------
我试过MySQL: could not select data with time range。 我经历了很多研究,但仍然没有得到我需要的东西。
所以这就是我的整个功能:
function check_materials(){
//$this->output->enable_profiler(TRUE);
$start = date("H:i:s", strtotime($this->input->post('start')));
$end = date("H:i:s", strtotime($this->input->post('end')));
$date_reserve = $this->input->post('date_reserve');
$id = $this->input->post('id');
$sql = "SELECT id, materialID FROM schedule_dummy WHERE date_reserve = ? AND time(?) BETWEEN start_time AND end_time AND time(?) BETWEEN start_time AND end_time";
$query = $this->db->query($sql,array($date_reserve,$start,$end));
$ids = array();
if($query->num_rows() > 0 ){
foreach($query->result() as $rows){
$ids[] = $rows->materialID;
}
}
$data = array();
$n = count($ids);
$idz = array();
if($n > 0){
$q = $this->db->select('*')->where_not_in('id',$ids)->where('cid', $id)->get('materials');
if($q->num_rows() > 0){
foreach($q->result() as $row){
$data[] = $row;
}
}
return $data;
}else{
$q = $this->db->select('*')->where('cid',$id)->get('materials');
if($q->num_rows() > 0 ){
foreach($q->result() as $row){
$data[] = $row;
}
}
return $data;
}
}
在此查询中,问题是当我选择start_time = 13:30:00
到end_time = 14:00:00
时,来自schedule_dummy且materialID
8
的数据无法检索。由于start_time和end_time是13:00:00
到14:00:00
。
当我尝试这个时:
$sql = "
SELECT materialID
FROM schedule_dummy
WHERE
date_reserve = ?
AND start_time >= time(?) AND end_time <= time(?)";
当我选择相同的输入时,它不会从schedule_dummy中检索数据。 那你觉得我在哪里错了怎么办?我的逻辑是错的吗?或者我的任何疑问?感谢。
答案 0 :(得分:0)
我相信你的问题是MySQL正在你的存储日期和参数日期之间进行字符串比较。将DATETIME
和TIME
列自动转换为字符串会产生您不期望的内容。 MySQL认为原始日期(没有时间)没有时间。
试试这个(参见DATE(?)
?):
SELECT materialID
FROM schedule_dummy
WHERE date_reserve = DATE(?)
AND start_time >= TIME(?)
AND end_time <= TIME(?)
检查此sqlfiddle:http://sqlfiddle.com/#!2/ecc35/12/0
注意:有些人使用<
而不是<=
进行结束时间比较,因此连续的时间间隔在逻辑上不会重叠。
答案 1 :(得分:0)
最后找到解决方案。我changed
的数据类型为start_time
,end_time
为DATETIME
,并使用此查询。
$sql = "SELECT materialID
FROM schedule_dummy
WHERE date_reserve = DATE(?)
AND TIME(?) BETWEEN start_time AND end_time
OR TIME(?) BETWEEN start_time AND end_time";