基于财年规则及当前月减3逻辑生成月度关闭状态的SQL查询需求
实现财年月度关闭标记的SQL查询方案
核心逻辑拆解
- 财年计算规则:对于任意日期,若月份≥10,则财年为「年份+1」;否则财年为当前年份。例如:
- 2022-10-01 → 2023财年
- 2023-09-30 → 2023财年
- 2023-10-01 → 2024财年
- 月度关闭标记规则:目标月份是其所属财年的最后3个月(自然月7、8、9月),且当前日期已进入该财年的下一财年时,标记为
Y;否则标记为N。
通用SQL查询方案
以下代码兼容多数关系型数据库(如PostgreSQL、MySQL、BigQuery等,仅需根据数据库特性调整日期函数):
SELECT date_column, -- 计算目标日期的财年 CASE WHEN EXTRACT(MONTH FROM date_column) >= 10 THEN EXTRACT(YEAR FROM date_column) + 1 ELSE EXTRACT(YEAR FROM date_column) END AS fiscal_year, -- 生成月度关闭标记 CASE -- 满足两个条件:是财年最后3个月,且当前已进入下一财年 WHEN EXTRACT(MONTH FROM date_column) IN (7, 8, 9) AND (CASE WHEN EXTRACT(MONTH FROM date_column) >= 10 THEN EXTRACT(YEAR FROM date_column) + 1 ELSE EXTRACT(YEAR FROM date_column) END) + 1 = (CASE WHEN EXTRACT(MONTH FROM CURRENT_DATE) >= 10 THEN EXTRACT(YEAR FROM CURRENT_DATE) + 1 ELSE EXTRACT(YEAR FROM CURRENT_DATE) END) THEN 'Y' ELSE 'N' END AS is_closed FROM your_table;
针对例子的逻辑调整
若你提到的「当前6月时,3月标记为Y其余为N」是正确的预期结果,说明规则可能存在描述偏差。如果需求是标记当前日期减3个月的那个月份,可调整is_closed的判断逻辑:
CASE WHEN EXTRACT(YEAR_MONTH FROM date_column) = EXTRACT(YEAR_MONTH FROM CURRENT_DATE - INTERVAL '3 months') THEN 'Y' ELSE 'N' END AS is_closed
说明
如果之前用区间对比未得到正确结果,通常是因为财年计算逻辑未正确关联当前日期的财年,或未准确匹配「下一财年」的判断条件。上述方案通过明确拆分财年计算和标记逻辑,可避免此类问题。
内容的提问来源于stack exchange,提问作者user22876576
相关产品推荐
相关产品推荐

