Azure Data Factory为何可直接比较YYYYMMDD与YYYY-MM-DD格式日期?
为什么两种日期格式的字符串能在ADF Filter活动中正确比较?
你的Filter逻辑能正常运行,核心原因是ADF表达式中的字符串比较是基于ASCII字符的逐位顺序,而两种日期格式的字符序列刚好在你的测试场景下满足预期:
1. 字符串比较的规则
ADF的表达式引擎在比较字符串时,会逐位对比两个字符串的字符ASCII值:
- 如果某一位的字符ASCII值不同,直接根据该位的大小判断整个字符串的大小;
- 如果前面的字符都相同,较短的字符串会被判定为更小。
2. 两种日期格式的字符对比
你的两个日期字符串结构:
- 从文件名提取的日期:
20240227(YYYYMMDD,8位) - 7天前的日期:
2024-02-23(YYYY-MM-DD,10位)
逐位对比:
- 前4位(年份):
2024vs2024→ 完全一致; - 第5位:
0(来自YYYYMMDD的月份第一位) vs-(来自YYYY-MM-DD的分隔符):0的ASCII值是48,-的ASCII值是45;- 48 > 45,因此
20240227会被判定为大于2024-02-23,满足greaterOrEquals的条件。
对于近7天内的文件,它们的年份和当前7天前的年份一致,第5位的0-9(ASCII 48-57)始终大于-(45),因此会被正确筛选。
3. 潜在的逻辑风险
这种写法是场景巧合下的正确,存在明显的误判风险:
- 若文件日期早于7天前,但年份相同(比如7天前是
2024-02-23,文件日期是20240222),字符串比较会判定20240222>2024-02-23,错误地将该文件纳入筛选结果; - 若跨年份(比如当前是
2024-01-05,7天前是2023-12-30),早于7天前的20231229会被判定为大于2023-12-30,同样出现误判。
4. 正确的写法
应该将两个日期统一为相同格式(比如YYYYMMDD)后再比较,避免依赖ASCII巧合:
{ "items": "@activity('GetFileList').output.childItems", "condition": "@greaterOrEquals(substring(item().name,13,8), replace(substring(subtractFromTime(utcnow(), 7, 'Day'), 0, 10), '-', ''))" }
这里用replace去掉7天前日期字符串中的横杠,得到20240223格式的字符串,和文件名提取的日期格式完全一致,比较逻辑严谨且无歧义。
内容的提问来源于stack exchange,提问作者Curtis Scott
相关产品推荐
相关产品推荐

