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

每日FTP报表任务跨年数据筛选规则实现(非函数/存储过程)

解决方案:根据任务运行时间动态筛选报表年份

先把你的核心规则对应示例梳理清楚:

  • 日常运行非1月1日凌晨:报表只包含和任务运行年份一致的TransferDate数据
  • 1月1日凌晨执行任务:报表要拉取任务运行年份减1的全部历史数据
  • 1月1日非凌晨执行:报表仅包含任务运行年份的新数据

简洁SQL实现无需函数/存储过程

直接用GETDATE()的日期属性做条件判断,避开复杂的嵌套逻辑:

SELECT 
    DateReceived, 
    UniqueNumber, 
    TransferDate, 
    CompanyCode 
FROM ExportData 
WHERE 
    YEAR(CONVERT(DATETIME, TransferDate)) = 
    CASE 
        -- 这里把凌晨定义为0-5点,你可以根据实际任务的执行时段调整小时阈值
        WHEN MONTH(GETDATE()) = 1 AND DAY(GETDATE()) = 1 AND DATEPART(HOUR, GETDATE()) < 6 
        THEN YEAR(GETDATE()) - 1
        -- 其他所有场景,直接匹配任务运行的当前年份
        ELSE YEAR(GETDATE())
    END
ORDER BY TransferDate DESC;

逻辑说明

  1. 特殊场景锁定:通过MONTH()、DAY()和DATEPART(HOUR)精准识别1月1日凌晨的特殊任务时段
  2. 日常场景兼容:自动匹配任务运行年份的TransferDate数据,完全符合默认需求
  3. 完美适配示例:
    • 任务在01.01.2019 01:00运行时,自动取2019-1=2018年的数据
    • 任务在01.01.2019 19:00运行时,取2019年的新数据
    • 其他日期运行时,直接拉取对应当年的数据

性能优化小技巧

如果你的TransferDate字段本身就是datetime类型,可以去掉CONVERT(DATETIME, TransferDate),直接用YEAR(TransferDate),能提升查询效率:

SELECT 
    DateReceived, 
    UniqueNumber, 
    TransferDate, 
    CompanyCode 
FROM ExportData 
WHERE 
    YEAR(TransferDate) = 
    CASE 
        WHEN MONTH(GETDATE()) = 1 AND DAY(GETDATE()) = 1 AND DATEPART(HOUR, GETDATE()) < 6 
        THEN YEAR(GETDATE()) - 1
        ELSE YEAR(GETDATE())
    END
ORDER BY TransferDate DESC;

内容的提问来源于stack exchange,提问作者Luci C

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:33:00