2013-08-31 4 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 자료를 검색하는 것입니다. 내가 MySQL: could not select data with time range을 시도했습니다

    ------DB Table materials-------- 
     id  | cid  |  mname   | mdesc  
    ---------------------------------------------------------- 
     7  |  1  |  accer   | acer 
     10  |  1  |  scanner  | scanner 
     12  |  1  |  prjector  | scanner 
    ---------------------------------------------------------- 

: 그리고 재료 테이블이 테이블 날짜가 있습니다. 저는 많은 연구를 해왔지만 여전히 필요한 것을 얻지 못했습니다.

그래서이는 내 전체 기능의 모습과 같은 :이 쿼리에서

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

} 

내가 검색하지 않습니다 8materialID와 schedule_dummy에서 start_time = 13:30:00end_time = 14:00:00에 다음 데이터를 선택할 때 문제가 있습니다. 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

중복 가능성 [사용하여 데이터를 얻는 방법> = AND <= PHP/MySQL은 12 시간의 시간 형식? (http://stackoverflow.com/questions/18531453/how-to-get -the-data-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_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"; 
관련 문제