每日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;
逻辑说明
- 特殊场景锁定:通过
MONTH()、DAY()和DATEPART(HOUR)精准识别1月1日凌晨的特殊任务时段 - 日常场景兼容:自动匹配任务运行年份的TransferDate数据,完全符合默认需求
- 完美适配示例:
- 任务在
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
相关产品推荐
相关产品推荐

