SQL自定义财年规则下生成财年季度计算列的实现方案咨询
解决方案
你需要的自定义财年季度匹配可以通过CASE WHEN条件判断实现,逻辑通用适配所有主流SQL数据库,不需要额外关联维度表,单表即可完成查询。
注:你给出的2021年Q4时间范围存在笔误,结束时间应为2022年1月28日,否则时间区间倒序不符合逻辑,下述逻辑已按修正后的规则处理。
以下是MySQL环境的参考代码,你可以根据自己使用的数据库修改日期转换、字符串拼接函数即可:
SELECT `Order Number`, `Order Date`, `Amount`, -- 自定义财年季度计算逻辑 CASE -- Q1:1月30日~4月30日 WHEN MONTH(order_date) IN (2,3,4) OR (MONTH(order_date) = 1 AND DAY(order_date) >= 30) THEN CONCAT('FY', RIGHT(YEAR(order_date), 2), 'Q1') -- Q2:5月1日~7月30日 WHEN MONTH(order_date) = 6 OR (MONTH(order_date) = 5 AND DAY(order_date) >= 1) OR (MONTH(order_date) = 7 AND DAY(order_date) <= 30) THEN CONCAT('FY', RIGHT(YEAR(order_date), 2), 'Q2') -- Q3:7月31日~10月29日 WHEN MONTH(order_date) IN (8,9) OR (MONTH(order_date) = 7 AND DAY(order_date) >= 31) OR (MONTH(order_date) = 10 AND DAY(order_date) <= 29) THEN CONCAT('FY', RIGHT(YEAR(order_date), 2), 'Q3') -- Q4:10月30日~次年1月28日,财年后缀取次年后两位 ELSE CONCAT('FY', RIGHT(YEAR(order_date + INTERVAL 1 YEAR), 2), 'Q4') END AS `Fiscal Year` FROM ( -- 子查询先把字符串格式的订单日期统一转为日期类型,避免重复计算 SELECT *, STR_TO_DATE(`Order Date`, '%m/%d/%Y') AS order_date FROM 你的表名 ) t
不同数据库适配修改点
- PostgreSQL:将
STR_TO_DATE替换为TO_DATE,字符串拼接可以用||运算符,年份取后两位可以用TO_CHAR(order_date, 'YY') - SQL Server:将
STR_TO_DATE替换为CONVERT(DATE, [Order Date], 101),年份取后两位写法为RIGHT(CAST(YEAR(order_date) AS VARCHAR), 2)
以上逻辑完全匹配你给出的示例输出:比如2020年9月10日属于Q3区间,直接取当年后两位20拼接为FY20Q3,和示例结果一致。
内容的提问来源于stack exchange,提问作者Hansie Rivera
相关产品推荐
相关产品推荐

