【问题标题】:Find if a given date is in a list of date ranges查找给定日期是否在日期范围列表中
【发布时间】:2010-11-20 21:46:03
【问题描述】:

我有一个需要不断处理的事件列表。该进程会处理该事件一段时间,然后它需要再次处理。这意味着,对于每个事件,我最终都会得到一个日期范围列表,在该列表中事件被“处理”,任何间隙都意味着该事件当时处于未处理状态。为此,我使用了两个表:

表进程

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 中运行它可能意味着对数据库的影响很大。另一方面,SQL 在查询方面通常更快。另一方面,this similar issue 表明无论如何都需要基于光标的解决方案。

任何指针都会受到赞赏,即使它们只是更好的搜索字符串。 (谷歌搜索任何日期范围问题似乎需要一些技巧。)

【问题讨论】:

  • 什么编程语言?你还没说呢。
  • 我用c#,但我想我可以翻译其他语言的回复。
  • 能否请您提供一些您的数据库示例以及您想查询什么?
  • 这样做了,并且会研究你的答案。

标签: c# sql date-range


【解决方案1】:

查询任何给定日期的事件状态:

SELECT  TOP 1 eventState
FROM    processing
WHERE   eventId = @id
        AND processingDate <= GETDATE()
ORDER BY
        processingDate DESC

更新:

如果日期在EffectiveDaysDateProcessed 之间,我假设事件是processed

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

【讨论】:

  • 我假设 eventState 是计算出来的,因为它不在处理中(并且不能因为它取决于日期)。您能否阐明它是如何在完整查询中计算的。 (我知道您的意思,但无法将其放入评论中。)
  • 只需进行两项更改。 pi.DateProcessed 也不应该在查询日期之后,因为这可能是过去的某个时间,因为可能已经完成了其他处理。同样从 ln 6 on p & pi 开始感到困惑。非常感谢。如果循环导致过多的 DB 命中,我将重新讨论这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-29
相关资源
最近更新 更多