den*_*isb 2 oracle indexing oracle10g oracle11g
好的,所以我想转换日期值以正确格式化我的日期以进行比较,但是,在比较该字段时,将我的"DATE"数据类型转换为char会影响索引吗?我可以通过执行to_date(tochar())来解决这个问题吗?对此有任何建议将不胜感激谢谢!
编辑 - 很抱歉缺乏细节....基本上我需要消除我的日期时间戳,我使用以下,它似乎工作TO_DATE(TO_CHAR,'YYYY-MM-DD'),'YYYY-MM -DD'),请注意我不知道这是不是很好的做法,但至少(或者我认为)现在它将DATE与DATE进行比较,而不是字符串.
如果要进行比较,则不应将日期转换为字符串.你应该与另一个日期进行比较.否则,Oracle将无法在日期列上使用基于非函数的索引.
一般来说,就是编码时你会好得多
WHERE some_indexed_date_column = to_date( :string_bind_variable,
<<format mask>> )
Run Code Online (Sandbox Code Playgroud)
而不是
WHERE to_char( some_indexed_date_column,
<<format mask>> ) = :string_bind_variable
Run Code Online (Sandbox Code Playgroud)
当然,如果你的绑定变量可以是a DATE而不是a VARCHAR2,那就更好了,因为那时你不必进行任何数据类型转换,优化器有更容易估计基数的时间.
如果你试图对日期进行一些操作 - 例如,如果你想比较日期部分而省略日期的时间部分 - 你可能想要使用基于函数的索引.例如,如果要查找今天某个时间创建的所有行
WHERE trunc( some_date_column ) = date '2011-11-04'
Run Code Online (Sandbox Code Playgroud)
您可以在日期列上创建基于函数的索引
CREATE INDEX idx_trunc_dt
ON table_name( trunc( some_date_column ) )
Run Code Online (Sandbox Code Playgroud)
或者你可以重写查询来做类似的事情
WHERE some_date_column >= date '2011-11-04'
AND some_date_column < date '2011-11-05'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6068 次 |
| 最近记录: |