【问题标题】:Oracle - Converting Date value TO_CHAR()Oracle - 将日期值转换为 TO_CHAR()
【发布时间】:2011-12-22 03:57:05
【问题描述】:

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

编辑 - 抱歉缺少细节......基本上我需要从我的日期中删除时间戳,我使用了以下内容,它似乎可以工作 TO_DATE(TO_CHAR, 'YYYY- MM-DD'),'YYYY-MM-DD'),请注意,我不知道这是否是一种好习惯,但至少(或者我认为)现在它正在将 DATE 与 DATE 进行比较,而不是一个字符串。

【问题讨论】:

    标签: oracle indexing oracle10g oracle11g


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这个答案与 imo 的问题相去甚远——@de​​nisb 询问的是索引,而不是比较技术。
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-22
        • 2012-11-04
        相关资源
        最近更新 更多