如果您加入可接受范围的表,则可以过滤掉没有函数或函数索引的时间片。您可以像这样动态创建一个(请注意,您需要这些函数来创建表,但之后您将不再需要它们):
SELECT
TRUNC(SYSDATE + 6) - (7 * LEVEL) + INTERVAL '10' HOUR AS StartAt,
TRUNC(SYSDATE + 6) - (7 * LEVEL) + INTERVAL '11' HOUR AS EndAt
FROM DUAL
CONNECT BY LEVEL <= 10
今天的日期是 2013 年 5 月 8 日,这将为您提供以下信息:
STARTAT ENDAT
------------------- -------------------
05/07/2013 10:00:00 05/07/2013 11:00:00
04/30/2013 10:00:00 04/30/2013 11:00:00
04/23/2013 10:00:00 04/23/2013 11:00:00
04/16/2013 10:00:00 04/16/2013 11:00:00
04/09/2013 10:00:00 04/09/2013 11:00:00
04/02/2013 10:00:00 04/02/2013 11:00:00
03/26/2013 10:00:00 03/26/2013 11:00:00
03/19/2013 10:00:00 03/19/2013 11:00:00
03/12/2013 10:00:00 03/12/2013 11:00:00
03/05/2013 10:00:00 03/05/2013 11:00:00
现在只需将其加入您的查询以获得所需的时间片,并注意您不需要函数:
WITH TimeRanges AS (
SELECT
TRUNC(SYSDATE + 6) - (7 * LEVEL) + INTERVAL '10' HOUR AS StartAt,
TRUNC(SYSDATE + 6) - (7 * LEVEL) + INTERVAL '11' HOUR AS EndAt
FROM DUAL
CONNECT BY LEVEL <= 10
)
SELECT
... whatever ...
FROM your_table hy
INNER JOIN TimeRanges ON
hy.tstamp >= TimeRanges.StartAt AND
hy.tstamp < TimeRanges.EndAt
如果您的数据库人员了解时间戳函数过滤会降低性能(除非 Woot4Moo 指出,他们实现了函数索引),他们就会明白用于创建时间片表的函数不会影响更大的查询。