MYSQL日期范围查询奇怪的行为

问题描述 投票:0回答:1

我正在使用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

预先感谢。

php mysql sql codeigniter
1个回答
0
投票

您将日期时间存储为字符串(使用VARCHAR类型),因此它们将作为字符串进行比较 - 逐个字符。出于显而易见的原因,'3'字符大于'1'。这就是过滤器设置的原因......

WHERE tournament_end_date_time >= '31/12/2017'

...你只能得到相应值从'31 / 12'开始的结果 - 换句话说,就是12月31日(2017年 - 或之后的任何一年)。

要解决此问题,可以使用STR_TO_DATE() MySQL函数将现有列值转换为实际日期。请注意,param将被视为日期文字,因为它遵循'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类型。

© www.soinside.com 2019 - 2024. All rights reserved.