查找与目标日期范围重叠的所有日期范围

Ian*_*ose 5 performance oracle database-design sql-server query-performance

假设我希望在员工休假 ( FromDate, ToDate)时进行存储,然后我希望找到在两个给定日期 ( QFromDate, QToDate)之间休假的所有员工。

现在假设我有很多这样的记录(超过服务器 RAM 的容量)并且需要经常执行此查询。

现在假设我还有sick_leave表格、shift_pattern表格、pay_rate表格等——所有这些都具有FromDateToDate需要根据重叠日期将它们连接起来。

我应该如何存储日期范围以及如何编写查询以快速运行?

(RDBMS 的选择不是固定的,但能够在任何“标准”RDBMS 上运行是有价值的,除非这样做会产生很大的不利影响。)

我已经发布了一些我考虑过的答案,但不喜欢!然而,他们可能会帮助其他人。

sto*_*tox 5

例如,您可以生成一个自定义索引表,其中包含日期范围(某个假期等)包含的所有年份和星期对的行。然后您可以通过浏览该索引表来加入日期范围。它会很大,但确实避免了大扫描,因为您可以将与另一个假期有任何共同周的所有假期列为内部联接。

伪示例:

create table rangeindex (
  vacation_id bigint, 
  year int, 
  week int, 
  primary key (year,week,vacation_id), 
  index (vacation_id))

select v2.* 
    from vacation v1 
    join rangeindex r1 on r1.vacation_id = v1.vacation_id 
    join rangeindex r2 on r2.year = r1.year and r2.week = r1.week
    join vacation v2 on v2.vacation_id = r2.vacation_id
where v1.vacation_user = ?
    -- and the usual start/end comparisons to filter unwanted pseudo hits
Run Code Online (Sandbox Code Playgroud)

类似的东西用于例如空间坐标的东西,将线性坐标划分为可以更容易地索引和扫描的网格单元。

更新:固定主键


Jam*_*yan 0

生成一个日历表(可通过谷歌搜索)并将其他表加入其中。这使得以有效的方式轻松进行重叠等。

如果不清楚这是标准方式。我没有讨论示例用法,因为这里的答案太复杂了。搜索“日历表”将提供大量示例和完整的解释。

您不需要重新解决表扫描问题,因为对两个日期字段建立索引已经涵盖了该问题。