2013-08-31 82 views
0

我有這兩個查詢。我的第一個問題是檢查材料的可用性,這也是我現在遇到的主要問題。它將一次選擇所有已保留的材料。 所以我有這個表日期schedule_dummy表: 注:我使用codeigniter。搜索時間範圍不工作在PHP/MySQL

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與8materialID數據不檢索。由於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檢索數據相同的輸入。 那麼你認爲我在這裏犯了什麼錯誤?我的邏輯錯了嗎?或者我的任何疑問?謝謝。

+0

可能重複的[如何使用來獲取數據> = AND <=在PHP/MySQL的一個12小時時間格式?](http://stackoverflow.com/questions/18531453/how-to-get -h-data-using-and-in-a-12hr-time-format-in-php-mysql) –

+0

@Venkat:Yah它也是我的線程。但情況並非如此。並請請閱讀我的問題。 – leonardeveloper

+0

請顯示你的表的結構:'describe schedule_dummy' –

回答

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

注:有些人使用<而不是<=的結束時間比較,所以連續的時間間隔不要」邏輯上重疊。

+0

仍然不適用於我的先生。 – leonardeveloper

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