PostgreSQL查询:如何获取每月最后一天的所有记录
获取PostgreSQL中每月最后一天的所有记录
针对你的需求,这里提供两种高效的PostgreSQL查询方案,直接筛选出指定时间范围内每月最后一天的所有记录:
方案一:直接通过日期函数判断
利用date_trunc计算当月第一天,再推导当月最后一天,直接匹配原日期:
SELECT 名称, 数量, 日期 FROM snacks WHERE 日期 = (date_trunc('month', 日期) + INTERVAL '1 month - 1 day')::DATE AND 日期 BETWEEN '2016-08-02' AND CURRENT_DATE;
逻辑说明
date_trunc('month', 日期):将任意日期截断至当月第一天(如2018-01-31会转为2018-01-01)+ INTERVAL '1 month - 1 day':在当月第一天基础上加1个月再减1天,得到当月最后一天- 最后将结果转为
DATE类型,与原日期字段匹配,即可筛选出当月最后一天的所有记录
方案二:子查询预取每月最后一天再关联
先通过分组查询找出每个月实际存在的最后一天,再与原表关联获取对应记录:
SELECT s.名称, s.数量, s.日期 FROM snacks s INNER JOIN ( SELECT MAX(日期) AS month_end_date FROM snacks WHERE 日期 BETWEEN '2016-08-02' AND CURRENT_DATE GROUP BY date_trunc('month', 日期) ) m ON s.日期 = m.month_end_date;
逻辑说明
- 子查询通过
GROUP BY date_trunc('month', 日期)按月份分组,用MAX(日期)取出每个月的最后一天 - 原表与子查询结果通过日期字段关联,即可得到所有对应日期的记录
示例结果
执行上述任意语句后,将得到如下结果:
| 名称(str) | 数量(int) | 日期(date) |
|---|---|---|
| Cookie | 15 | 2018-01-31 |
| Brownie | 14 | 2018-01-31 |
| Cookie | 5 | 2018-02-28 |
| Brownie | 6 | 2018-02-28 |
关于你尝试的date_trunc+distinct方案
单独使用date_trunc只能得到月份维度的截断值,distinct仅能去重月份,无法直接关联到当月最后一天的具体记录,因此无法满足需求。
内容的提问来源于stack exchange,提问作者Tarcisio Lopes
相关产品推荐
相关产品推荐

