You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 13:06:08