我有一个以GMT UTC + 0开头和结束时间戳的事件列表。该列是DATE类型,但也有时间(不是我设计的)。
开始时间戳明确编入索引
我需要查找在东部夏令时间UTC-4的当地时间06:00到22:00之间发生的事件。在3月31日到4月2日之间的任何一天。
我发现这样做的唯一方法是将其转换为TO_CHAR()。它也没有使用索引,因为它使用TO_CHAR函数。
这是我到目前为止所做的事情。
TO_CHAR(e.begin_time,'HH24:MI') >= TO_CHAR(FROM_TZ(TO_TIMESTAMP('06:00','HH24:MI'),'US/Eastern') AT TIME ZONE '+00:00','HH24:MI') AND
TO_CHAR(e.begin_time,'HH24:MI') <= TO_CHAR(FROM_TZ(TO_TIMESTAMP('22:00','HH24:MI'),'US/Eastern') AT TIME ZONE '+00:00','HH24:MI') AND
TO_CHAR(e.begin_time,'DDMMYYYY HH24:MI') >= TO_CHAR(FROM_TZ(TO_TIMESTAMP('Mar-31-2012 00:00','MON-DD-YYYY HH24:MI'),'US/Eastern') AT TIME ZONE '+00:00','DDMMYYYY HH24:MI') AND
TO_CHAR(e.begin_time,'DDMMYYYY HH24:MI') <= TO_CHAR(FROM_TZ(TO_TIMESTAMP('Apr-2-2012 23:59','MON-DD-YYYY HH24:MI'),'US/Eastern') AT TIME ZONE '+00:00','DDMMYYYY HH24:MI')
提前致谢,
丹
答案 0 :(得分:1)
以下的性能可能不是您想要的,但是如果您将DATE值转换为TIMESTAMP,您可以使用类似于以下的方式使用EXTRACT函数:
SELECT *
FROM your_table e
WHERE e.BEGIN_TIME BETWEEN TO_DATE('31-MAR-2012 00:00:00',
'DD-MON-YYYY HH24:MI:SS')
AND TO_DATE('02-APR-2012 23:59:59',
'DD-MON-YYYY HH24:MI:SS') AND
EXTRACT(HOUR FROM CAST(e.BEGIN_TIME AS TIMESTAMP)) BETWEEN 6 AND 22
分享并享受。
答案 1 :(得分:0)
当尝试根据日期字段的一部分获取数据时,当然不会使用索引。没有任何解决方法。但是,您可以考虑添加基于函数的索引来索引EST中当天的会议记录。或者,也许,添加一个新列来保存minutes_est,让它由插入/更新触发器填充,然后根据它进行查询。
如果这是一个经常使用的查询,并且全表扫描的性能没有削减它,那么是 - 我认为这是您可能需要根据您的需求进行一些重新设计的时间之一。