Oracle技术求助:如何按年/月提取表中实际最大业务日期
解决按年月提取实际最大业务日期的问题
嗨,这个需求太常见了!LAST_DAY()确实只能返回当月的日历最后一天,完全没法匹配业务数据里实际存在的最晚日期,咱们换个思路用分组+聚合就能轻松搞定。
核心逻辑很简单:先把业务日期归到对应的“年月”分组里,再对每个分组取业务日期的最大值,这个最大值就是该月实际存在的最大业务日期。
下面给你几个主流SQL数据库的具体实现示例:
MySQL 实现
SELECT DATE_FORMAT(business_date, '%Y-%m') AS year_month, MAX(business_date) AS actual_max_business_date FROM your_table_name -- 替换成你的表名 GROUP BY DATE_FORMAT(business_date, '%Y-%m') ORDER BY year_month;
PostgreSQL 实现
推荐用DATE_TRUNC截断日期到月份,比字符串格式化更可靠:
SELECT DATE_TRUNC('month', business_date) AS month_period, MAX(business_date) AS actual_max_business_date FROM your_table_name -- 替换成你的表名 GROUP BY DATE_TRUNC('month', business_date) ORDER BY month_period;
如果需要返回YYYY-MM格式的年月字符串,也可以用TO_CHAR:
SELECT TO_CHAR(business_date, 'YYYY-MM') AS year_month, MAX(business_date) AS actual_max_business_date FROM your_table_name GROUP BY TO_CHAR(business_date, 'YYYY-MM') ORDER BY year_month;
SQL Server 实现
SELECT FORMAT(business_date, 'yyyy-MM') AS year_month, MAX(business_date) AS actual_max_business_date FROM your_table_name -- 替换成你的表名 GROUP BY FORMAT(business_date, 'yyyy-MM') ORDER BY year_month;
额外优化建议
如果你的表数据量很大,记得给business_date字段创建索引,这样分组聚合的查询效率会提升不少。
内容的提问来源于stack exchange,提问作者Abhishek Bm
相关产品推荐
相关产品推荐

