php - 搜索时间范围在 php/mysql 中不起作用

标签 php mysql codeigniter datetime time

我有两个疑问。我的第一个查询是检查 Material 的可用性,这也是我现在遇到的主要问题。它将选择一次已保留的所有 Material 。 所以我有 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 中不存在的 Material 。我有 Material 表的表格日期:

                  ------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 中的数据8 的 code>materialID 无法检索。由于 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 检索数据。 那么你认为我在哪里犯了错误呢?我的逻辑是不是错了?或者我有什么疑问吗?谢谢。

最佳答案

我相信你的问题是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

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

关于php - 搜索时间范围在 php/mysql 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18548244/

相关文章:

php - 我怎样才能加快我的 cron 作业/数据库更新

mysql - 带条件的 Laravel ORM

php - Codeigniter 在页面顶部加载 CSS/JS 文件

php - 在 CodeIgniter Controller 中建立 SSH 连接

php - 最佳 PHP 数据网格

php - Activerecord 代码点火器 3

php - SEO 友好的 URLs - 从 blog.php?articleId=26 到 blog/$articleTitle

javascript - 在 Session 中存储随机字符串,当我通过另一个 PHP 文件调用它时,该字符串会被覆盖

javascript - 将数组存储在本地存储中

php - 使用curl下载间接图像文件