Oracle - 转换日期值TO_CHAR()

den*_*isb 2 oracle indexing oracle10g oracle11g

好的,所以我想转换日期值以正确格式化我的日期以进行比较,但是,在比较该字段时,将我的"DATE"数据类型转换为char会影响索引吗?我可以通过执行to_date(tochar())来解决这个问题吗?对此有任何建议将不胜感激谢谢!

编辑 - 很抱歉缺乏细节....基本上我需要消除我的日期时间戳,我使用以下,它似乎工作TO_DATE(TO_CHAR,'YYYY-MM-DD'),'YYYY-MM -DD'),请注意我不知道这是不是很好的做法,但至少(或者我认为)现在它将DATE与DATE进行比较,而不是字符串.

Jus*_*ave 8

如果要进行比较,则不应将日期转换为字符串.你应该与另一个日期进行比较.否则,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)