首页 文章

Oracle - 转换日期值TO_CHAR()

提问于
浏览
2

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

编辑 - 抱歉缺乏细节....基本上我需要消除我的日期时间戳,我使用以下,它似乎工作TO_DATE(TO_CHAR,'YYYY-MM-DD'),'YYYY-MM-DD'),记住你我不比较't know if this is good practice or not, but at least (or so I think) now it' s比较DATE对DATE,而不是字符串 .

3 回答

  • 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 ,那么's even better because then you don't必须进行任何数据类型转换,优化器可以更容易地估算基数 .

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

    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'
    
  • 3

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

  • 2

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

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

相关问题