首先,您永远不应该使用VARCHAR2
数据类型将日期或时间戳数据存储在表中。您应该始终使用正确的数据类型(date
、timestamp
、timestamp with time zone
等)。以错误的数据类型存储数据会导致性能问题(优化器的基数估计通常会变得不那么准确,并且索引列变得更加成问题)以及当某些应用程序无意中存储字符串时难以发现的错误表中的错误格式导致各种查询开始抛出错误,或者执行计划的细微变化导致错误突然开始(或停止)出现。
其次,假设end_time
表中每一行中的每个字符串(是否满足其他两个谓词)的格式为YYYY-MM-DD HH24:MI:SS.FFF
SELECT COUNT(*)
FROM STGDBA.INTERACTIONS
WHERE APP_ID='Home Depot'
AND PEGA_ID ='0'
AND to_date(substr(END_TIME,1,length(end_time)-4),
'YYYY-MM-DD HH24:MI:SS' ) BETWEEN TO_DATE('2012-AUG-01', 'YYYY-MON-DD')
AND TO_DATE('2012-AUG-31', 'YYYY-MON-DD')
您总是希望将日期与日期进行比较,将字符串与字符串进行比较,因此您不想将表达式的左侧用to_char
. 当您调用 时,您总是希望指定一个明确的格式掩码to_date
,这就是我在这里所做的。而且 adate
没有亚秒级精度,因此您必须去掉小数秒(如果您声明end_time
为 a ,这将不是问题timestamp(3)
)。