0

この2つのクエリがあります。私の最初の質問は、材料の入手可能性を確認することです。これは、私が現在直面している主な問題でもあります。一度に予約されているすべての資料を選択します。したがって、私はこのテーブルの日付を 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   
   ----------------------------------------------------------

私の 2 番目のクエリは、最初のクエリから取得した 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を選択すると、 ofend_time = 14:00:00を持つ schedule_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

最後に解決策を見つけます。私はこのクエリをand 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 に答える