WithinC 和 WithinR 函数执行基于日历的查询,在时间单位之间进行转换并执行日历算术来从时间系列值中抽取关注的时间段。
WithinC(ts TimeSeries, tstamp datetime year to fraction(5), interval lvarchar, num_intervals integer, direction lvarchar) returns TimeSeries; WithinR(ts TimeSeries, tstamp datetime year to fraction(5), interval lvarchar, num_intervals integer, direction lvarchar) returns TimeSeries;
每个时间系列有一个日历,描述时间系列的活动时间段和不活动时间段以及发生的频率。常规时间系列会记录日历的每个活动时间段的一个值。日历可具有以下时间段:秒、分钟、小时、天、周、月或年。假设有一个时间系列,您可能想要在其上进行基于日历的查询,如“显示自 2004 年 5 月 31 日开始的六年间,此每日系列中的所有值”或“显示包含 2010 年 12 月 27 日的那一周中,此每小时系列中的值”。
Within 函数是查询此表单的主要机制。它们在时间单位之间转换并执行日历算术来从时间系列值中抽取关注的时间段。Within 查询有两个基本变体:标准化 (WithinC) 和相对 (WithinR)。
WithinC 或在标准化内采用时间戳记并查找包括该时间的时间段。周具有自然界限(周日到周六),年(1 月 1 日到 12 月 31 日)、月(每月的第一天到最后一天)、天(24 小时)、小时(60 分钟)、分钟(60 秒)也同样具有自然界限。WithinC 使您可以指定时间戳记并查找包括该时间戳记的相应时间段。
例如,2010 年 7 月 2 日,周五。假设为每小时时间系列,WithinC 使您可以要求从该周周日的午夜开始到周六晚上 11:59:59 结束的系列中的所有每小时值。当然,日历可能不会将所有这些小时标记为活动;Within 函数仅会返回活动时间段的数据。
WithinR 或在相对内采用用户的时间戳记,并会查找在该时间开始或结束的时间段。例如,假设为每周时间系列,WithinR 可抽取自 2008 年 6 月 3 日开始的两年内的所有每周值。WithinR 可以将周转换为年,并从提供的日期向前或向后计数请求的时间间隔数。相对表示提供您所关注的确切时间戳记作为范围开始点或结束点。
WithinR 的行为在非常规时间系列与常规时间系列之间略有不同。使用常规时间系列,时间戳记自变量始终会根据自变量时间系列日历时间间隔映射到某个时间点。然后,从该点开始执行相对偏移。
在非常规时间系列中,相应日历时间间隔不会指示时间系列元素所在的位置,因此偏移正好在指定时间戳记开始。此外,由于非常规元素可显示在日历时间间隔内的任何点,因此 WithinR 会返回时间戳记达到自变量时间间隔最后一个瞬间的元素。
WithinR(stock_data, '2010-07-11 07:37:18', 'day', 3, 'future') [2010-07-11 07:37:18, 2010-07-14 07:37:18]
[2010-07-11 00:00:00, 2010-07-13 00:00:00]
两个函数都采用一个时间系列、一个时间戳记、一个时间间隔名称、一个时间间隔数和一个方向。
提供的时间间隔名称不必与时间系列日历存储的时间间隔相同,但它不能小于该时间间隔。例如,假设为每小时时间系列,那么 Within 函数可向前或向后计数若干小时、天、周、月或年,但不能为分钟或秒。
方向自变量指示应包括哪些时间段(包含该时间戳记的时间段除外);如果仅存在一个时间段,那么方面自变量没有实际意义。
对于 WithinC 和 WithinR,输出中包含请求的时间点。
与原始时间系列具有相同日历的新时间系列,但仅包含请求的值。
select WithinC(stock_data, '2011-01-04 00:00:00.00000', 'week', 1, 'PAST') from daily_stocks where stock_name = 'GBase';
origin(2011-01-03 00:00:00.00000),calend ar(daycal), container(),threshold(20),re gular,[(356.0000000000,310.0000000000,340.000000000, 999.0000000000),(156.000000 0000,110.0000000000,140.0000000000,111.0000000000), NULL, (99.00000000000,54.000 00000000,66.00000000000, 888.0000000000)]
select WithinR(activity_data, '2011-01-04 09:30:00.00000', 'week', 2, 'future') from activity_stocks where stock_id = 600;
select WithinR(activity_data, '2011-02-01 00:00:00.00000', 'month', 3, 'past') from activity_stocks where stock_id = 600;