Oracle - 转换日期值TO_CHAR()

时间:2011-11-04 15:56:20

标签: oracle indexing oracle10g oracle11g

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

编辑 - 对于缺乏具体信息感到抱歉....基本上我需要从我的约会中删除时间戳,我使用以下内容,它似乎工作到去年7月(TO_CHAR,'YYYY- MM-DD'),'YYYY-MM-DD'),请注意我不知道这是不是很好的做法,但至少(或者我认为)现在它将DATE与DATE进行比较,而不是一个字符串。

3 个答案:

答案 0 :(得分:8)

如果您正在进行比较,则不应将日期转换为字符串。你应该与另一个日期进行比较。否则,Oracle将无法在日期列上使用基于非函数的索引。

一般情况下,就是编码

会好得多
WHERE some_indexed_date_column = to_date( :string_bind_variable, 
                                          <<format mask>> )

而不是

WHERE to_char( some_indexed_date_column, 
               <<format mask>> ) = :string_bind_variable

当然,如果你的绑定变量可以是DATE而不是VARCHAR2,那就更好了,因为那时你不必进行任何数据类型转换,优化器也更容易估计基数的时间。

如果您正在尝试对日期进行一些操作 - 例如,如果您想要比较日期部分而省略日期的时间部分 - 您可能希望使用基于函数的索引。例如,如果您想查找今天某个时间创建的所有行

WHERE trunc( some_date_column ) = date '2011-11-04'

您可以在日期列

上创建基于函数的索引
CREATE INDEX idx_trunc_dt
    ON table_name( trunc( some_date_column ) )

或者您可以重写查询以执行类似

的操作
WHERE some_date_column >= date '2011-11-04'
  AND some_date_column <  date '2011-11-05'

答案 1 :(得分:3)

您应该将日期比较为日期,而不是字符串。如果将日期与字符串进行比较,请将字符串转换为要比较的日期。

答案 2 :(得分:2)

IMO,您应该将比较值转换为存储在数据库中的格式。否则,您需要在DATE列上创建基于函数的索引以利用索引。因此,如果您的输入字符日期为11/4/2011,则可以在where子句中进行比较:

SELECT ...
  FROM your_table
 WHERE the_date_column = TO_DATE('11/4/2011','MM/DD/YYYY');