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

标签 php mysql sql codeigniter

我正在研究 codeigniter 和 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();

此查询的输出是空数组 数组();

当我在数据库中手动更改 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 类型。

关于php - MYSQL 日期范围查询奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48044350/

相关文章:

php - 在 Laravel 中添加操作 =""时表单失控

php - 简单的 PHP 表格到 MySQL 不起作用,也许表格不准确?

mysql - 合并两个单独的 mysql 查询

java - jOOQ - 将架构名称添加到所有表

php - Notepad++ 删除内含特定文本的标签

php - Propel2 自定义查询耗尽了允许的内存大小

mysql 报告 : count unique login per day

mysql - 如何在rails中获得默认排序规则?

php - 从 Synology NAS 连接 mysql

php - 如何在laravel的 Blade 文件中显示最新的('updated_at')记录