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 № 1Przechowujesz 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.