使用mod运算符的Oracle查询

时间:2018-10-24 17:13:06

标签: sql oracle

我有一个spring批处理,它尝试从下表每5分钟将待处理的文档上载到服务器。当前,在5次未成功上传文件的尝试之后,该批处理会将记录标记为失败并发送通知电子邮件。我正在尝试增强此批处理,以尝试在5次尝试之后有6小时的间隔再上传2次。也就是说,直到FAIL_CTR达到5时,才会尝试每5分钟上传一次记录。 FAIL_CTR达到5后,将尝试每6小时上传一次记录。

到目前为止,这是我为查询选择的要上传的批处理记录的内容。问题是,对于已失败5次的记录,在第6小时,批次将尝试每5分钟上传一次。我只需要在第5次尝试后6小时后和第6次尝试后6小时后再执行一次即可。我该如何实现?

select * from SUPPORT_DOCS DOCS   
        where (DOCS.FAIL_CTR < 5  OR (DOCS.FAIL_CTR < 7 AND floor(mod(24*(SYSDATE-DOCS.LAST_ATTEMPTED_DATE),6))=0))
        and DOCS.STATUS='F';

Table

1 个答案:

答案 0 :(得分:1)

我认为逻辑应该是

 Select * from SUPPORT_DOCS DOCS   
    where (
      (DOCS.FAIL_CTR < 5  OR 
      (DOCS.FAIL_CTR = 5 AND SYSDATE-DOCS.LAST_ATTEMPTED_DATE > 0.25) OR 
      (DOCS.FAIL_CTR = 6 AND SYSDATE-DOCS.LAST_ATTEMPTED_DATE > 0.5)
    )
    and DOCS.STATUS='F';

date1-oracle中的date2以天为单位生成结果,因此您希望在重试之前延迟四分之一天,然后是半天。我假设重试可以可靠地更新上一次尝试的日期并增加失败计数器。