首页 > 解决方案 > MySQL日期比较查询

问题描述

我的数据库中有这张表:

table t

id   |  a   | b  | date_x

1    |  81  | 12 | 2018-03-16
2    |  9   | 54 | 2025-04-21
3    |  81  | 67 | 2018-03-16
4    |  763 | 81 | 2018-03-16
5    |  90  | 22 | 2025-12-08

date_x 是日期类型

我想选择 a = 81 或 b = 81 且 date_x 在 2019-05-28 之前的行。

所以我在 MySQL Workbench 中执行以下查询:

SELECT * FROM t
WHERE a = '81' OR b = '81'
AND date_x > '2019-05-28';

这就是我得到的:

1    |  81  | 12 | 2018-03-16
3    |  81  | 67 | 2018-03-16

我希望 2018-03-16 不迟于 2019-05-28 。此外,为什么只返回 2 行?在 date_x 列中还有另一个日期相同。

此查询返回相同:

SELECT * FROM t
WHERE a = '81' OR b = '81'
AND date_x > str_to_date('2019-05-28', '%Y-$m-%d');

我为调试执行了以下查询:

SELECT * FROM t
WHERE a = '81' OR b = '81'
AND date_x < '2019-05-28';

SELECT * FROM t
WHERE a = '81' OR b = '81'
AND date_x < str_to_date('2019-05-28', '%Y-$m-%d');

然后两者都按预期返回:

1    |  81  | 12 | 2018-03-16
3    |  81  | 67 | 2018-03-16
4    |  763 | 81 | 2018-03-16

我阅读了以下问答,但我仍然遗漏了一些东西:

有什么提示吗?谢谢

标签: mysqldatabaseselect

解决方案


您的查询具有以下形式

SELECT * FROM t WHERE condition_a OR condition_b AND condition_c

运算符的AND绑定比 强OR,因此您最终得到

SELECT * FROM t WHERE condition_a OR (condition_b AND condition_c)

这就是我认为混乱的来源。与日期无关。


推荐阅读