如何在SQL Server中自动获取S3桶中指定日期的文件(含周一特殊处理)
SQL Server自动化生成S3文件查询条件方案
针对你需要自动筛选S3桶中周六、周日、周一上传文件的需求,可通过判断当前日期的星期几,动态生成对应的文件匹配模式,无需手动修改语句。以下是两种实现方式:
方式一:生成逗号分隔的文件模式字符串
适合需要将所有匹配条件合并为单个字符串的场景:
-- 强制设置周一为一周的第一天,避免系统默认日期设置影响判断 SET DATEFIRST 1; SELECT CASE -- 当前为周一(DATEPART(dw)返回1)时,生成周六和周日的文件模式 WHEN DATEPART(dw, CURRENT_TIMESTAMP) = 1 THEN STRING_AGG('abc_' + FORMAT(DATEADD(day, -n, CURRENT_TIMESTAMP), 'yyyyMMdd') + '*.csv', ', ') -- 周二至周日,仅生成前一天的文件模式 ELSE 'abc_' + FORMAT(DATEADD(day, -1, CURRENT_TIMESTAMP), 'yyyyMMdd') + '*.csv' END AS s3_file_patterns FROM (VALUES (2), (3)) AS days(n);
代码说明
SET DATEFIRST 1:确保SQL Server将周一识别为一周的第一天,避免因不同服务器设置(比如默认周日为第一天)导致星期判断错误。- 周一逻辑:通过
VALUES (2), (3)指定回溯2天(周日)和3天(周六),用STRING_AGG将两个文件模式拼接为逗号分隔的字符串。 - 非周一逻辑:和你原语句逻辑一致,仅生成前一天的文件模式。
方式二:生成多行文件模式
适合需要逐个遍历匹配文件的场景(周一返回两行,其他日期返回一行):
SET DATEFIRST 1; SELECT 'abc_' + FORMAT(DATEADD(day, days.n, CURRENT_TIMESTAMP), 'yyyyMMdd') + '*.csv' AS s3_file_pattern FROM ( SELECT CASE DATEPART(dw, CURRENT_TIMESTAMP) WHEN 1 THEN -3 -- 周一取周六的文件(前3天) ELSE -1 -- 其他日期取前1天的文件 END AS n UNION ALL SELECT CASE DATEPART(dw, CURRENT_TIMESTAMP) WHEN 1 THEN -2 -- 周一额外取周日的文件(前2天) ELSE NULL END AS n ) AS days WHERE days.n IS NOT NULL;
代码说明
- 子查询通过
UNION ALL构造需要回溯的天数:周一返回-3和-2两个值,其他日期仅返回-1。 - 外层查询过滤掉
NULL值,最终在周一输出两行文件模式,其他日期输出一行。
内容的提问来源于stack exchange,提问作者Anjali Rahangdale
相关产品推荐
相关产品推荐

