我有一个具有LETTER_SENT日期字段的Oracle表。 LETTER_SENT是一个varchar2字段,并且是一个yyyymmdd文本字符串(所以20140708表示这封信是在2014年7月8日发送的)。注意:这不是我的表,我只有授予SELECT的权利,所以我不能强制它为yyyymmdd日期。在VARCHAR2是日期的VARCHAR2字段上使用索引
通常,我需要查找在一系列日期中发送的信件。通常,我在WHERE IN('开始日期',...,'结束日期')。根据我对SQL的理解,以这种方式进行操作并不会以任何方式修改该字段,而不会影响索引的使用(而转换为日期或数字,然后进行比较会影响索引)。
表现明智,这很好。然而,有时我的日期范围很大,并且有一个巨大的IN,... OR IN,...或WHERE语句中的IN子句很丑陋。
当日期是一个索引varchar2时,还有另外一个语法更漂亮,但仍然有效的方法来在where子句(date_begin和date_end之间的日期比较)中进行日期比较吗?
您是否尝试过'letter_sent> ='20160101'和letter_sent <='20160430''?我想知道包含这些数字的索引字符串如何提取数据。也许它是高性能的 - 我不知道。只是好奇,如果你已经尝试过。 – zedfoxus
@zedfoxus这个工程好得多 - 我不相信我忘了这个作品!请张贴这个答案,让我可以upvote和接受它,砸我的头,我忘了这一点。 – Joe
Tom Kyte有一个非常令人信服的会议演示文稿(我在OTN上的一个主题中看到了一个链接) - 他展示了一个具体的例子,说明应该对日期进行编码的'VARCHAR2'列的索引与索引'DATE'列 - 用于完全相同的数据(除了此列的不同数据类型外)。不要在日期中使用'VARCHAR2';这是超过100个优秀原因之一。 – mathguy