好的,所以我想转换日期值以正确格式化我的日期以进行比较,但是,在比较该字段时,将我的“DATE”数据类型转换为char会影响索引吗?我可以通过执行to_date(tochar())来解决这个问题吗?对此有任何建议将非常感谢谢谢!
编辑 - 对于缺乏具体信息感到抱歉....基本上我需要从我的约会中删除时间戳,我使用以下内容,它似乎工作到去年7月(TO_CHAR,'YYYY- MM-DD'),'YYYY-MM-DD'),请注意我不知道这是不是很好的做法,但至少(或者我认为)现在它将DATE与DATE进行比较,而不是一个字符串。
答案 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');