MySQL技术问询:如何查询两个日期之间的数据?
查询MySQL数据表中两个日期之间的数据的实现方法
假设你的数据表名为client_credit(如果实际表名不同,请替换成你的表名),首先明确你的表结构如下:
| ID_Client | Code_House | Jangka_Kredit | Angsuran_Kredit | Date |
|---|---|---|---|---|
| PR-331 | HM-0023 | 5年 | 10500000 | 2010-11-20 |
| PR-331 | HM-0045 | 3年 | 4800000 | 2011-04-02 |
| PR-331 | HM-0050 | 3年 | 5200000 | 2011-05-03 |
| PR-332 | HM-0024 | 10年 | 800000 | 2010-06-08 |
| PR-333 | HM-0035 | 8年 | 2000000 | 201... |
要查询该表中两个日期之间的数据,MySQL提供了几种简单直接的实现方式,下面逐一说明:
1. 使用 BETWEEN 关键字(包含两端日期)
这是最直观的写法,会包含指定的起始和结束日期的所有记录:
SELECT * FROM client_credit WHERE Date BETWEEN '2010-01-01' AND '2011-05-01';
比如上面的查询会返回Date字段为2010-01-01到2011-05-01之间的所有行,包括这两天的记录。
2. 使用 >= 和 <= 进行范围判断
这种写法和BETWEEN效果完全一致,但在需要更复杂的条件组合时会更灵活:
SELECT * FROM client_credit WHERE Date >= '2010-01-01' AND Date <= '2011-05-01';
3. 排除端点的范围查询
如果你需要查询的是起始日期之后和结束日期之前的记录(不包含两端),可以用>和<:
SELECT * FROM client_credit WHERE Date > '2010-01-01' AND Date < '2011-05-01';
4. 处理包含时间的Date字段(datetime类型)
如果你的Date字段实际是datetime类型(包含时分秒),直接用BETWEEN '2010-01-01' AND '2011-05-01'只会查到2011-05-01 00:00:00之前的记录,想要包含2011-05-01当天所有时间的记录,推荐用下面的写法(避免索引失效):
SELECT * FROM client_credit WHERE Date >= '2010-01-01' AND Date < '2011-05-02';
或者你也可以用DATE()函数提取日期部分,但这种写法会导致Date字段上的索引无法被使用(如果有索引的话),仅在没有索引或者数据量较小时推荐:
SELECT * FROM client_credit WHERE DATE(Date) BETWEEN '2010-01-01' AND '2011-05-01';
注意事项
- 确保日期字符串的格式是MySQL能识别的(比如
YYYY-MM-DD),避免格式错误导致查询结果异常。 - 如果
Date字段有索引,尽量避免在字段上使用函数(比如DATE()),否则会触发全表扫描,影响查询性能。
内容的提问来源于stack exchange,提问作者zOne




