如何使用SQL查询当前年份所有月份及对应天数并补全月份前导零
解决方案
1 修正月份为带前导零的两位格式
你当前的实现存在两处问题:
- 日期转换格式符设置错误:SQL中
to_char转换月份时,M格式符输出无前置零的单/双位月份,MM才会输出固定2位带前置零的月份,你之前输出单数字就是格式符选择错误导致的 - 过滤逻辑不规范:WHERE条件不能直接引用SELECT子句中定义的别名,大部分SQL方言不支持该写法,需要直接对日期字段做年份过滤
修正后的基础查询示例(通用标准SQL写法,适配PostgreSQL/Oracle):
SELECT DISTINCT TO_CHAR(date_column, 'MM') AS month FROM date_table WHERE EXTRACT(YEAR FROM date_column) = 2021;
如果使用MySQL,调整为对应语法即可:
SELECT DISTINCT DATE_FORMAT(date_column, '%m') AS month FROM date_table WHERE YEAR(date_column) = 2021;
2 查询各月份对应的天数
不同数据库有对应的内置函数可以直接计算当月天数,以下是各主流数据库的实现示例:
PostgreSQL实现
SELECT DISTINCT TO_CHAR(date_column, 'MM') AS month, DATE_PART('days', DATE_TRUNC('month', date_column) + INTERVAL '1 month' - INTERVAL '1 day') AS month_days FROM date_table WHERE EXTRACT(YEAR FROM date_column) = 2021;
MySQL实现
SELECT DISTINCT DATE_FORMAT(date_column, '%m') AS month, DAY(LAST_DAY(date_column)) AS month_days FROM date_table WHERE YEAR(date_column) = 2021;
Oracle实现
SELECT DISTINCT TO_CHAR(date_column, 'MM') AS month, EXTRACT(DAY FROM LAST_DAY(date_column)) AS month_days FROM date_table WHERE EXTRACT(YEAR FROM date_column) = 2021;
如果需要查询当前年份的数据,只需要把过滤条件中的固定年份2021替换为对应数据库的当前年份函数即可:
- PostgreSQL:
EXTRACT(YEAR FROM CURRENT_DATE) - MySQL:
YEAR(NOW()) - Oracle:
EXTRACT(YEAR FROM SYSDATE)
内容的提问来源于stack exchange,提问作者K4M41D
相关产品推荐
相关产品推荐

