网络宝典
第二套高阶模板 · 更大气的阅读体验

SQL查询上个月数据:几行代码搞定实际需求

发布时间:2026-03-27 00:30:49 阅读:2 次

做报表、看运营数据、导客户订单,经常要查“上个月干了啥”。比如财务月底对账,销售要看上月成交额,客服想统计上月投诉量——这时候,SQL里写对时间条件就特别关键。

核心思路:用日期函数动态算出上个月范围

别手敲'2024-03-01'和'2024-03-31',一到换月就得改,太容易出错。直接让数据库自己算:

WHERE order_date >= DATE_SUB(LAST_DAY(NOW()), INTERVAL DAY(LAST_DAY(NOW())) DAY)
AND order_date < LAST_DAY(NOW()) + INTERVAL 1 DAY

这段在 MySQL 里能稳稳查出上个月 1 号到月底的所有记录。它不依赖当前具体日期,今天跑、下月跑结果都自动更新。

不同数据库写法有差别,挑你用的来

PostgreSQL 用户可以这样写:

WHERE order_date >= (CURRENT_DATE - INTERVAL '1 month')::date
AND order_date < CURRENT_DATE::date

SQL Server 更直白些:

WHERE order_date >= DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE())-1, 1)
AND order_date < DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1)

注意:如果月份是 1 月,SQL Server 的 MONTH(GETDATE())-1 会变成 0,得加个 CASE 处理,但日常用得少,先记住基础写法就行。

实战小技巧:别漏掉时分秒

假设字段是 created_at DATETIME 类型,只写 >= '2024-03-01' 会漏掉 3 月 1 日 00:00:00 之前的记录(比如 2024-03-01 00:00:00.001)。更稳妥的是:

WHERE created_at >= '2024-03-01'
AND created_at < '2024-04-01'

这种“左闭右开”写法,既清晰又不会因毫秒级时间踩坑。

顺便提一句:WHERE 和 BETWEEN 别乱混

有人爱用 BETWEEN '2024-03-01' AND '2024-03-31',看着省事,但遇到 DATETIME 字段容易丢掉 3 月 31 日 23:59:59 之后的数据。不如明确写上下界,心里踏实。

查上个月这事,真没那么玄乎——抓住“动态计算起止日”这个点,再根据你手里的数据库选对函数,一行 WHERE 就能跑通。