在VARCHAR2字段上使用索引,其中VARCHAR2是日期

时间:2017-03-07 18:33:23

标签: sql oracle

我有一个具有LETTER_SENT日期字段的Oracle表。 LETTER_SENT是varchar2字段,是yyyymmdd的文本字符串(因此20140708表示该字母是2014年7月8日发送的)。注意:这不是我的桌子,我只有在它上面的SELECT授权所以我不能强迫它到yyyymmdd日期。

我经常需要查找在一系列日期中发送的信件。通常,我会在哪里('开始日期',...,'结束日期')。根据我对SQL的理解,这样做并不会以任何不会影响索引使用的方式修改字段(而转换为日期或数字然后进行比较会影响到索引)。

表现明智,这很好。但是,有时我的日期范围非常大,并且在WHERE语句中有一个庞大的IN,...... OR IN,... OR IN子句就像罪恶一样难看。

当日期是索引的varchar2时,是否存在另一种语法上更漂亮但仍然高效的方法来在where子句(date_begin和date_end之间的日期)进行日期比较?

2 个答案:

答案 0 :(得分:2)

执行此操作的正确方法是使用DATE数据类型而非VARCHAR2()存储LETTER_SENT。在语法,索引的使用,结果的正确性,优化器统计和最终性能方面,您将会好得多。

答案 1 :(得分:0)

由于你在varchar2字段上有索引,我相信你可以使用这样的查询:

dispatch(action)

可以按顺序处理文本,您可以使用索引获得欲望结果。

从长远来看,将select * from tablename where letter_sent >= '20160101' and letter_sent <= '20160430' 创建为日期字段会很有效,使用letter_sent_date中的数据更新此字段,然后弃用letter_sent。您将从使用以letter_sent这样的以日期为中心的函数中获益,而不是需要将varchar2字段转换为日期然后应用函数。