2017-12-31 243 views
0

私はcodeigniterとmysql dbに取り組んでいます。私は最近のデータを日付ごとに表示する必要がある問題に取り組みました。MYSQLの日付範囲のクエリが異常な動作

私はこのクエリの出力は空の配列 array();

手動iは、私はそのtournament_end_date >= $todays_date

マイクエリ

$today = date("d/m/Y"); 

     $this->db->select('*'); 

     $this->db->from('tbl_tournament'); 

     $this->db->where('is_deleted', FALSE); 

     $this->db->where('tournament_end_date_time >=', $today); 

     $this->db->order_by('tournament_start_date_time'); 

     $query = $this->db->get(); 

     return $query->result_array(); 

トーナメントデータをフェッチするつもりテーブル名tbl_tournamentを持っていますデータベース内のtournament_end_date_time = 01/04/2018を変更し、$this->db->where('tournament_end_date_time >=', '01/04/2017');という質問が表示されます。しかし、私は$this->db->where('tournament_end_date_time >=', '31/12/2017');としてクエリの日付を変更すると、私は空の配列を取得します。私は事前にデータ型tournament_end_date_time

感謝としてvarchar型を使用しているMySQLデータベースで

+2

なぜ、MySQLのネイティブデータ型またはdatetimeデータ型ではなく、フォーマットされた日付文字列を格納するためにvarcharを使用していますか?正しいデータ型を使用すると、すべての比較が正しく動作します –

答えて

0

datetimesを文字列(VARCHARタイプ)として格納するため、文字列ごとに文字列として比較されます。明らかな理由から、 '3'文字は '1'より大きい。言い換えれば、12月の、31(2017 - - それはあなたが唯一の対応する値は、'31/12' から開始し、結果を得るでしょう...

WHERE tournament_end_date_time >= '31/12/2017' 

...なぜフィルターセットをだ、または任意それ以後)。

この問題を解決するには、STR_TO_DATE() MySQL関数を使用して、既存の列の値を実際の日付に変換することができます。 CodeIgniterの規則以下、PHP構文で、

WHERE STR_TO_DATE(tournament_end_date_time, '%d/%m/%Y') >= '2017-12-31' 

...または:paramは、それは次の 'YYYY-MM-DD' 形式として日付リテラルとして扱われることに注意してください

$this->db->where(array(
    "STR_TO_DATE(tournament_end_date_time, '%d/%m/%Y') >=" => date("Y-m-d") 
)); 

より良い選択は、すべての値をDATEタイプに一度に変換するために、この列に対して1回の更新操作を実行することです。

+0

ありがとうございました。データ型を現在の日付に変更しました。 –