如何使用case statement处理日期 实现2021年日期区间调整
实现思路
你需要先明确规则优先级,避免逻辑冲突:同一年份保留原值的规则优先级最高,只有跨年的活动才需要做2021年的日期截断,逻辑顺序如下:
- 先判断活动开始、结束日期是否属于同一年份:如果是,两个日期全部保留原始值,不做修改
- 对跨年活动单独做截断处理:
- 开始日期早于2021年1月1日的,统一重置为2021年1月1日
- 结束日期晚于2021年12月31日的,统一重置为2021年12月31日
- 日期本身落在2021年区间内的,保留原始值
CASE语句实现代码
以下是通用SQL写法,核心逻辑适配所有支持CASE语法的数据库,日期常量可根据你所用库的日期格式要求调整:
SELECT -- 计算调整后的活动开始日期 CASE WHEN YEAR(activity_start_date) = YEAR(activity_end_date) THEN activity_start_date WHEN activity_start_date < '2021-01-01' THEN '2021-01-01' ELSE activity_start_date END AS adjusted_activity_start_date, -- 计算调整后的活动结束日期 CASE WHEN YEAR(activity_start_date) = YEAR(activity_end_date) THEN activity_end_date WHEN activity_end_date > '2021-12-31' THEN '2021-12-31' ELSE activity_end_date END AS adjusted_activity_end_date FROM 你的报表表名;
注意事项
- 日期格式适配:如果你使用的数据库有特定日期格式要求,比如Oracle需要写
DATE '2021-01-01'、部分业务系统要求DD/MM/YY格式写'01/01/21',直接替换代码里的日期常量即可,CASE判断逻辑不需要改动 - 空值兼容:如果两个日期字段存在空值,可以在每个CASE语句的最前面增加
WHEN activity_start_date IS NULL THEN NULL(对应开始日期判断)、WHEN activity_end_date IS NULL THEN NULL(对应结束日期判断),避免年份计算报错 - 结果校验:可以用以下典型场景验证逻辑是否符合预期:
- 活动时间为2020-05-01至2020-10-01:同属2020年,两个日期均保留原值
- 活动时间为2020-03-01至2022-05-01:跨年,开始日期调整为2021-01-01,结束日期调整为2021-12-31
- 活动时间为2021-03-01至2023-01-01:跨年,开始日期保留原值,结束日期调整为2021-12-31
- 活动时间为2020-12-01至2021-06-01:跨年,开始日期调整为2021-01-01,结束日期保留原值
- 活动时间为2021-02-01至2021-11-01:同属2021年,两个日期均保留原值
提示:如果业务要求调整后的开始日期必须早于等于结束日期,可以在现有逻辑外层补充极端场景的判断(比如活动全程在2022年之后的跨年场景),上述代码是严格匹配你给出的三条业务规则编写的。
内容的提问来源于stack exchange,提问作者user19110389
相关产品推荐
相关产品推荐

