想象一下,如果您想对非分数时间范围进行建模,则可以是以下任何一种:
"1 hour" (all/any 1 hour period)
"1 hour, starting 1pm") (all/any 1 hour periods that start at 1pm)
"1 hour, starting 1pm, on Wednesdays" (all/any 1 hour periods that start at 1pm on wednesdays)
"1 hour, starting 1pm, on 3rd Wednesday in November"
"1 week, starting the first week in November"
你明白了。另一个目标是轻松有效地计算这些范围的重叠和子集。例如,“1 小时,周三下午 1 点开始”与“1 小时,下午 1 点开始”重叠
附加信息:这是基线系统中的时间段。我想为基线段设置多个时间段粒度。就像下午 1 点任何 1 小时期间的基线或 11 月第 3 个星期三下午 1 点开始的 1 小时期间的基线。
另一个考虑因素是这些基线周期将存储在无 sql 存储中,并且以存储中存在的最小粒度有效地细化周期会很好。(是否存在特定的日-周-小时周期?不,周小时怎么样?,不?只有一天小时的时间段怎么样) - 如果这是有道理的。也许是某种树状层次结构。
编辑:存储和查询部分可能是最重要的要求。将存储数十亿个时间段,需要尽快查找它们(找到存在的最细粒度)。我很乐意为查找速度牺牲完整性。
编辑:多考虑一下,以及如何将它存储在数据存储中,树状结构可能有利于高效查找。我可以沿着树向下走以获得存在的最细粒度。
1hr
/
1hr@1pm
/
1hr@1pm@wednesday
/
1hr@1pm@wednesday@November
这是我想出的,但我觉得它很弱。我将继续摆弄它并在这里更新,但我很想知道是否有人有更聪明的方法来建模它。
public class DateRange {
Integer fTimeSpan;
TimeUnit fTimeUnit;
Integer fStartHour;
Integer fStartDay;
Integer fStartWeek;
Integer fStartMonth;
boolean intersects(DateRange other) { ... }
}
enum TimeUnit {
HOURS,
DAYS,
WEEKS,
MONTHS;
}
编辑:基于树的结构(如我上面的编辑)会简单得多。大粒度跨度没有未使用的字段。粒度将在树中,而不是在数据结构中......
public class RangeTreeNode {
TimeUnit fTimeUnit;
int fStartTime;
int fSpanTime;
List<RangeTreeNode> fChildren;
}