0

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

当我尝试这个时:

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

当我选择相同的输入时,它不会从 schedule_dummy 检索数据。那么你认为我在这里有什么错误?我的逻辑错了吗?或者我的任何疑问?谢谢。

4

2 回答 2

0

终于找到解决办法了。我有和tochanged的数据类型并使用了这个查询。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";
于 2013-08-31T16:48:24.790 回答
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

注意:有些人使用<而不是<=结束时间比较,因此连续的时间间隔在逻辑上不会重叠。

于 2013-08-31T14:06:43.010 回答