/ / Dziwne zachowanie w zapytaniu zakresu dat MYSQL - php, mysql, sql, codeigniter

Zakres dat zapytania MYSQL dziwne zachowanie - php, mysql, sql, codeigniter

Pracuję nad codeigniter i mysql db. Wystąpił problem, w którym muszę pokazać najnowsze dane według daty.

mam nazwę tabeli tbl_tournament, w której zamierzam pobrać dane turniejowe, których tournament_end_date >= $todays_date

Moje zapytanie

$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();

wyjściem tego zapytania jest pusta tablica array();

Po ręcznej zmianie tournament_end_date_time = 01/04/2018 w bazie danych i zapytaniu $this->db->where("tournament_end_date_time >=", "01/04/2017"); mam wyniki. Ale kiedy zmieniam datę w zapytaniu jako $this->db->where("tournament_end_date_time >=", "31/12/2017"); otrzymuję pustą tablicę.

W bazie danych MySQL użyłem varchar jako typu danych tournament_end_date_time

Z góry dziękuję.

Odpowiedzi:

0 dla odpowiedzi № 1

Przechowujesz dane jako ciągi (za pomocą VARCHAR type), stąd „są porównywane jako ciągi znaków - znak po znaku. Z oczywistych powodów znak„ 3 ”jest większy niż„ 1 ”.

WHERE tournament_end_date_time >= "31/12/2017"

... otrzymasz wyniki tylko wtedy, gdy odpowiadające im wartości zaczną się od „31/12” - innymi słowy, 31 grudnia (od 2017 r. - lub po jakimkolwiek innym roku).

Aby rozwiązać problem, możesz użyć STR_TO_DATE () Funkcja MySQL do konwersji istniejącej wartości kolumny na rzeczywistą datę. Zauważ, że parametr będzie traktowany jako literał daty, ponieważ jest zgodny z formatem „RRRR-MM-DD”:

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

... lub, w składni PHP, następujące konwencje CodeIgniter:

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

Lepszym wyborem jest wykonanie jednorazowej operacji aktualizacji w tej kolumnie, aby przekonwertować wszystkie jej wartości na DATE wpisz na raz.