[英]MYSQL date range query strange behaviour
我正在開發codeigniter和mysql db。 我遇到了一個問題,需要按日期顯示最新數據。
我的表名稱是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數據庫中,我已經使用varchar作為數據類型tournament_end_date_time
預先感謝。
您將日期時間存儲為字符串(具有VARCHAR
類型),因此將它們作為字符串進行比較-逐字符。 出於明顯的原因,“ 3”字符大於“ 1”。 這就是為什么要設置過濾器...
WHERE tournament_end_date_time >= '31/12/2017'
...您將只獲得相應值從'31 / 12'開始的結果-換句話說,就是12月31日(2017年-或之后的任何一年)。
要解決該問題,可以使用STR_TO_DATE() MySQL函數將現有的列值轉換為實際日期。 請注意,該參數將被視為日期文字,因為它遵循“ YYYY-MM-DD”格式:
WHERE STR_TO_DATE(tournament_end_date_time, '%d/%m/%Y') >= '2017-12-31'
...,或者使用PHP語法遵循CodeIgniter約定:
$this->db->where(array(
"STR_TO_DATE(tournament_end_date_time, '%d/%m/%Y') >=" => date("Y-m-d")
));
更好的選擇是對此列執行一次一次性更新操作,以一次將其所有值轉換為DATE
類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.