如何无需硬编码获取指定年份(如2023)1月起的每月首尾日期
解决方案
要实现指定年份从1月开始输出12个月的第一天和最后一天,不用硬编码每个月份,可以修改查询的起始基准日期,把原来基于SYSDATE的逻辑换成指定年份的年初日期。
带绑定变量的灵活写法
这种方式可以通过传入年份参数动态生成结果,不用修改查询语句:
SELECT TRUNC(ADD_MONTHS(TRUNC(TO_DATE(:target_year, 'YYYY'), 'YYYY'), LEVEL - 1), 'MM') FIRST_DAY, LAST_DAY(ADD_MONTHS(TRUNC(TO_DATE(:target_year, 'YYYY'), 'YYYY'), LEVEL - 1)) LAST_DAY FROM DUAL CONNECT BY LEVEL <= 12;
直接指定年份的写法
如果需要直接在查询里固定年份(但依然不用硬编码月份),可以把:target_year替换成具体年份,比如2023:
SELECT TRUNC(ADD_MONTHS(TRUNC(TO_DATE('2023', 'YYYY'), 'YYYY'), LEVEL - 1), 'MM') FIRST_DAY, LAST_DAY(ADD_MONTHS(TRUNC(TO_DATE('2023', 'YYYY'), 'YYYY'), LEVEL - 1)) LAST_DAY FROM DUAL CONNECT BY LEVEL <= 12;
逻辑说明
TRUNC(TO_DATE(:target_year, 'YYYY'), 'YYYY'):把输入的年份转换成该年的1月1日(比如传入2023就得到01-JAN-23)ADD_MONTHS(..., LEVEL - 1):利用CONNECT BY循环12次,从年初开始依次加上0到11个月,覆盖全年12个月份TRUNC(..., 'MM'):确保日期是当月的第一天LAST_DAY(...):直接获取当月的最后一天,自动处理2月的闰年情况
执行后,2023年的输出会从01-JAN-23开始,到31-DEC-23结束,包含全年12个月的首尾日期。
内容的提问来源于stack exchange,提问作者Pugzly
相关产品推荐
相关产品推荐

