搜索时间范围不适用于php / mysql

时间:2013-08-31 12:41:50

标签: php mysql codeigniter datetime time

我有两个问题。我的第一个问题是检查材料的可用性,这也是我现在遇到的主要问题。它将选择一次保留的所有材料。 所以我有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:00end_time = 14:00:00时,来自schedule_dummy且materialID 8的数据无法检索。由于start_time和end_time是13:00:0014:00:00

当我尝试这个时:

$sql = "
SELECT materialID 
FROM schedule_dummy 
WHERE 
  date_reserve = ? 
 AND start_time >= time(?) AND end_time <= time(?)"; 

当我选择相同的输入时,它不会从schedule_dummy中检索数据。 那你觉得我在哪里错了怎么办?我的逻辑是错的吗?或者我的任何疑问?感谢。

2 个答案:

答案 0 :(得分:0)

我相信你的问题是MySQL正在你的存储日期和参数日期之间进行字符串比较。将DATETIMETIME列自动转换为字符串会产生您不期望的内容。 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_timeend_timeDATETIME,并使用此查询。

   $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";