如何利用SETLL或其他操作码检查日期范围内的记录是否存在
问题解答
核心结论
可以通过SETLL结合READE操作码实现需求,无需遍历整个文件。
实现思路
- 利用逻辑文件按键
validfromDate、validtoDateRange排序的特性,用SETLL定位到第一个validfromDate小于等于指定日期的记录; - 调用
READE读取后续匹配validfromDate <= 指定日期的记录,逐一检查指定日期是否落在该记录的validtoDateRange范围内; - 一旦找到符合条件的记录立刻停止操作;若读到
validfromDate大于指定日期的记录,直接终止——因为键有序,后续记录的起始日期只会更大,不可能再匹配。
示例RPG代码片段
dcl-f iplmai keyed; dcl-s targetDate date; dcl-s found ind; targetDate = %date(); // 替换为需要检查的指定日期 // 定位到第一个validfromDate <= targetDate的记录 setll (targetDate: *hival) iplmai; if %found(iplmai); reade (targetDate: *hival) iplmai; dow %found(iplmai); if targetDate <= validtoDateRange; found = *on; leave; endif; reade (targetDate: *hival) iplmai; enddo; endif; // 处理检查结果 if found; // 存在符合条件的记录 else; // 不存在符合条件的记录 endif; close iplmai;
对应SQL语句(中文翻译)
SELECT 1 FROM SYSIBM.SYSDUMMY1 A WHERE EXISTS ( SELECT * FROM IPLDTAD.IPLMAI WHERE CURRENT_DATE BETWEEN VALFRDATE AND VALTODATE )
内容的提问来源于stack exchange,提问作者Theju112
相关产品推荐
相关产品推荐

