我有一个需要不断处理的事件列表。该过程将事件处理一段时间,因此需要再次处理。这意味着,对于每个事件,我最终会得到一个日期范围列表,其中事件被“处理”,任何间隙都意味着事件当时处于未处理状态。为此,我使用两个表:
表格流程
ProcessID int PK NOT NULL
EffectiveDays int NOT NULL
表格处理
EventID nvarchar(128) NOT NULL
ProcessID int FK REFERENCES Processes NOT NULL
DateProcessed int NOT NULL
EventID是基于SQL查询的结果以标准方式动态生成的,以确保它在运行期间保持不变。
我希望能够使用此签名实现一个方法(有时需要在循环中调用它):
bool Event.WasProcessed(DateTime AsOf)
我需要能够在给定日期查询事件所处的状态(已处理或未处理)。所以我需要找出所提供的日期是否在任何日期范围之一(可以重叠)。
我甚至不确定是在SQL还是代码中运行此查询。查询有时需要在一系列任意事件上运行(每个事件由一个保存事件的对象和一个处理列表代表),因此在SQL中运行它可能意味着要点击DB。另外,SQL通常在查询时更快。另一方面,this similar issue表明无论如何都需要基于游标的解决方案。
任何指针都会受到赞赏,即使它们只是更好的搜索字符串。 (谷歌搜索任何日期范围问题似乎需要一些技巧。)
答案 0 :(得分:0)
查询任何给定日期的事件状态:
SELECT TOP 1 eventState
FROM processing
WHERE eventId = @id
AND processingDate <= GETDATE()
ORDER BY
processingDate DESC
<强>更新强>
如果日期在processed
EffectiveDays
之内,我认为某个日期的事件为DateProcessed
。
SELECT p.ProcessID
FROM Processings pi
LEFT JOIN
Processes p
ON p.ProcessID = pi.ProcessID
AND p.EffectiveDays >= @date - pi.DateProcessed
WHERE pi.EventID = @EventID
AND pi.DateProcessed <= @date