如何为SQL查询配置当前及上一财年的dynamic dates?
动态生成当前及上一财年的SQL查询方案
假设你的财年规则是每年7月1日至次年6月30日,以下方案可以实现完全动态的财年日期与年份范围,无需手动硬编码更新:
通用SQL实现(适配多数数据库)
WITH fy_dates AS ( -- 计算当前财年的起始年份:当前月份≥7则取当年,否则取上一年 SELECT CASE WHEN EXTRACT(MONTH FROM CURRENT_DATE) >= 7 THEN EXTRACT(YEAR FROM CURRENT_DATE) ELSE EXTRACT(YEAR FROM CURRENT_DATE) - 1 END AS current_fy_start_year ) -- 当前财年数据查询 SELECT CONCAT(current_fy_start_year, '/', current_fy_start_year + 1) AS FY_YEAR_SNAPSHOT, 1 AS COUNT FROM YOUR_TABLE, fy_dates WHERE DATE(CONCAT(current_fy_start_year, '-07-01')) BETWEEN EFEC_STRT_DT AND EFEC_END_DT UNION ALL -- 上一财年数据查询 SELECT CONCAT(current_fy_start_year - 1, '/', current_fy_start_year) AS FY_YEAR_SNAPSHOT, 1 AS COUNT FROM YOUR_TABLE, fy_dates WHERE DATE(CONCAT(current_fy_start_year - 1, '-07-01')) BETWEEN EFEC_STRT_DT AND EFEC_END_DT;
针对Oracle数据库的调整
Oracle中CURRENT_DATE需要替换为SYSDATE,且日期转换需用TO_DATE函数:
WITH fy_dates AS ( SELECT CASE WHEN EXTRACT(MONTH FROM SYSDATE) >= 7 THEN EXTRACT(YEAR FROM SYSDATE) ELSE EXTRACT(YEAR FROM SYSDATE) - 1 END AS current_fy_start_year FROM DUAL ) SELECT CONCAT(current_fy_start_year, '/', current_fy_start_year + 1) AS FY_YEAR_SNAPSHOT, 1 AS COUNT FROM YOUR_TABLE, fy_dates WHERE TO_DATE(CONCAT(current_fy_start_year, '-07-01'), 'YYYY-MM-DD') BETWEEN EFEC_STRT_DT AND EFEC_END_DT UNION ALL SELECT CONCAT(current_fy_start_year - 1, '/', current_fy_start_year) AS FY_YEAR_SNAPSHOT, 1 AS COUNT FROM YOUR_TABLE, fy_dates WHERE TO_DATE(CONCAT(current_fy_start_year - 1, '-07-01'), 'YYYY-MM-DD') BETWEEN EFEC_STRT_DT AND EFEC_END_DT;
核心逻辑说明
- 通过CTE
fy_dates一次性计算当前财年的起始年份,避免重复计算 - 财年字符串(如
2023/2024)通过拼接起始年份和起始年份+1自动生成 - 财年起始日期(每年7月1日)通过拼接起始年份和固定月日动态生成,无需硬编码
- 上一财年只需将起始年份减1,即可自动对应上一财年的年份范围与起始日期
内容的提问来源于stack exchange,提问作者CK-P
相关产品推荐
相关产品推荐

