SQL如何按年末日期分组汇总,输出年末完整日期而非年份数字
实现方案
不同数据库的日期处理函数略有差异,核心逻辑都是先取日期对应的年份,再拼接/计算得到当年12月31日的日期,以下是主流数据库可直接复用的写法:
提示:如果你的
Mydate字段存储的是字符串格式(如示例中的15/6/2020),需要先按对应数据库规则转为日期类型再做计算,避免格式报错。
- MySQL 版本
-- 输出日期类型的年末日期 SELECT STR_TO_DATE(CONCAT(YEAR(Mydate), '-12-31'), '%Y-%m-%d') AS year_end_date, SUM(Amount) AS amount FROM table1 GROUP BY year_end_date -- 如需输出 12/31/2021 格式的字符串,使用下方写法 SELECT DATE_FORMAT(STR_TO_DATE(CONCAT(YEAR(Mydate), '-12-31'), '%Y-%m-%d'), '%m/%d/%Y') AS year_end_date, SUM(Amount) AS amount FROM table1 GROUP BY year_end_date
- SQL Server 版本
-- 输出日期类型的年末日期 SELECT DATEFROMPARTS(YEAR(Mydate), 12, 31) AS year_end_date, SUM(Amount) AS amount FROM table1 GROUP BY DATEFROMPARTS(YEAR(Mydate), 12, 31) -- 如需输出 12/31/2021 格式的字符串,使用下方写法 SELECT FORMAT(DATEFROMPARTS(YEAR(Mydate), 12, 31), 'MM/dd/yyyy') AS year_end_date, SUM(Amount) AS amount FROM table1 GROUP BY DATEFROMPARTS(YEAR(Mydate), 12, 31)
- PostgreSQL 版本
-- 输出日期类型的年末日期 SELECT (DATE_TRUNC('year', Mydate) + INTERVAL '1 year - 1 day')::DATE AS year_end_date, SUM(Amount) AS amount FROM table1 GROUP BY year_end_date -- 如需输出 12/31/2021 格式的字符串,使用下方写法 SELECT TO_CHAR((DATE_TRUNC('year', Mydate) + INTERVAL '1 year - 1 day')::DATE, 'MM/DD/YYYY') AS year_end_date, SUM(Amount) AS amount FROM table1 GROUP BY year_end_date
- Oracle 版本
-- 输出日期类型的年末日期 SELECT TRUNC(Mydate, 'YEAR') + INTERVAL '1' YEAR - INTERVAL '1' DAY AS year_end_date, SUM(Amount) AS amount FROM table1 GROUP BY TRUNC(Mydate, 'YEAR') + INTERVAL '1' YEAR - INTERVAL '1' DAY -- 如需输出 12/31/2021 格式的字符串,使用下方写法 SELECT TO_CHAR(TRUNC(Mydate, 'YEAR') + INTERVAL '1' YEAR - INTERVAL '1' DAY, 'MM/DD/YYYY') AS year_end_date, SUM(Amount) AS amount FROM table1 GROUP BY TRUNC(Mydate, 'YEAR') + INTERVAL '1' YEAR - INTERVAL '1' DAY
内容的提问来源于stack exchange,提问作者ggv
相关产品推荐
相关产品推荐

