2017-12-31 159 views
0

나는 codeigniter와 MySQL DB에서 일하고있다. 나는 날짜별로 최근 데이터를 보여줄 필요가있는 문제를 해결했다.MYSQL 날짜 범위 쿼리 이상한 행동

는 내가 그 대회 데이터를 가져 오는거야 테이블 이름 tbl_tournament이 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(); 

이 쿼리의 출력은 때 수동으로 빈 배열 array();

입니다 데이터베이스에서 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'); 빈 배열을 얻을.

는 MySQL 데이터베이스에 내가 미리 감사 데이터 형식 tournament_end_date_time

로 VARCHAR를 사용했다.

+2

왜 MySQL 기본 날짜 또는 datetime 데이터 형식이 아닌 형식화 된 날짜 문자열을 저장하기 위해 varchar를 사용하고 있습니까? 올바른 데이터 유형을 사용하면 모든 비교가 올바르게 작동합니다. –

답변

0

datetimes를 문자열 (VARCHAR 유형)로 저장하므로 문자열별로 문자별로 비교됩니다. 분명한 이유로 '3'문자가 '1'보다 큽니다. 즉 12 월의 31 (2017 - - 즉, 단지 해당하는 값이 '31/12 '에서 시작 결과를 얻을 수 있습니다 ...

WHERE tournament_end_date_time >= '31/12/2017' 

... 왜 필터 세트의 또는 1 년 후).

이 문제를 해결하려면 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 유형으로 한 번에 변환 할 수 있습니다.

+0

감사합니다. 지금 데이터 유형을 현재 날짜로 변경했습니다. –