MySQL 查询日期类型字段在某个月的数据

更新日期: 2022-03-17 阅读次数: 4838 字数: 332 分类: MySQL

在做的一个财务预算管理小程序部门支出流水功能,需要能查询出指定月份的财务流水数据。 MySQL 数据库中存储了财务支出条目发生的日期,需要能通过年月来过滤查询。

例如,我要查询 2022 年 3 月份的所有财务数据。

方法一(推荐)

SELECT * FROM financial_history 
WHERE `date` BETWEEN '2022-03-01' AND LAST_DAY('2022-03-01')

MySQL LAST_DAY 函数返回当前 date 或 datetime 类型值对应月份的最后一天。

MySQL LAST_DAY() returns the last day of the corresponding month for a date or datetime value. If the date or datetime value is invalid, the function returns NULL.

测试一下:

SELECT LAST_DAY("2022-03-01")
'2022-03-31'

方法二(不推荐)

SELECT * FROM financial_history
WHERE YEAR(`date`) = 2022 AND MONTH(`date`) = 3;

虽然 SQL 语句简洁清晰,但是这个查询的最大弊端是无法利用上日期字段的索引,只能扫描全表。 对于财务流水历史这样的数据量不可控的表,肯定是不敢用的。

方法三(不推荐)

SELECT * FROM financial_history 
WHERE `date` BETWEEN '2022-03-01' AND '2022-04-01'

这种做法完全是心存侥幸,认为下个月1号没有数据;或者对于 datetime 类型,那个时间点没有数据。 对财务核算类的功能自然是不严谨的。

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式

谈笑风生

gm

仲维兄,好呀!
这样也可以 SELECT * FROM financial_history WHERE `date` like '2022-03%'

大象

学习了,gm 老哥