`
singleant
  • 浏览: 378164 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

【JDBC,数据库】Oracle date和timestamp类型混用时需要注意的索引失效问题

阅读更多

1.关于 Oracle date和timestamp类型

Date :只能精确到秒。
TimeStamp:可以 精确到微秒。

关于具体类型不过多介绍。可以参考:

http://www.databasejournal.com/features/oracle/article.php/2234501/A-Comparison-of-Oracles-DATE-and-TIMESTAMP-Datatypes.htm

2.问题

生产环境在一条sql里使用到了 gmt_create > :1  and gmt_create< :2的条件语句。

数据库里的gmt_create字段是date类型。Ibatis里传入的类型是java.util.Date类型。gmt_create字段是有索引的,但是执行时没有走到索引,导致很慢。

 

3.原因分析

我们ORM使用的是ibatis。ibatis在处理传入到数据库的变量时候,如果为java.util.date类型的时候,解析为timestamp类型。可以看代码:

  public void setParameter(PreparedStatement ps, int i, Object parameter, String jdbcType)
      throws SQLException {
    ps.setTimestamp(i, new java.sql.Timestamp(((Date) parameter).getTime()));
  }


以下原因是重点
如果数据库中时间字段定义为date类型,由于timestamp类型的精度比date类型的精度高,所以oracle会对数据库里的date类型做出隐身转换,将date类型转换为timestamp类型,由于加了函数,那么创建在date类型上的索引将不会使用到;(好像是oracle9i后开始才有的问题)
网上翻查资料,有不少人遇到同样问题,这里面有两个同样的案例和解释:
https://forums.oracle.com/forums/thread.jspa?messageID=1659839
http://hidba.org/?p=280

 

4.推荐解决办法

如果oracle数据字段是date类型,建议传入字符串,使用to_date()函数来转换字符串为日期和date做比较。

使用java.sql.Date也是一个解决方案,不过该类型只精确到天,不满足很多场景的需求。

0
0
分享到:
评论
1 楼 cctodayer 2014-04-22  
非常好,刚好遇到这个问题,完美解决

相关推荐

    oracle中TIMESTAMP与DATE比较

    在Oracle数据库中,`TIMESTAMP`与`DATE`两种数据类型是用于存储日期和时间信息的关键组成部分,但它们之间存在显著的区别,特别是在处理时间和精度方面。本文将深入探讨这两种数据类型的特点,以及如何在实际应用中...

    Oracle date 和 timestamp 区别详解

    Oracle数据库中的DATE和TIMESTAMP是两种用于存储日期和时间信息的数据类型,它们在用途和精度上有显著的区别。 1. DATE数据类型: DATE类型是Oracle中最基础的日期时间数据类型,可以存储日期(年、月、日)和时间...

    Oracle Timestamp with Time zone & java

    Oracle的Timestamp with Time Zone类型与Java的交互是数据库编程中一个重要的知识点,特别是在处理跨越时区的数据时。本文将深入探讨这两个概念以及它们在实际应用中的互动。 Oracle的Timestamp with Time Zone类型...

    java使用jdbc将数据库数据导出到csv文件.pdf

    Java 使用 JDBC 将数据库数据导出到 CSV 文件 Java 是一种广泛使用的编程语言,它提供了多种方式来处理数据库数据,而 JDBC...在处理数据时,我们需要特殊处理 TIMESTAMP 类型数据,并需要异常处理以避免程序崩溃。

    oracle数据类型和对应的JDBC类型.pdf

    Oracle 数据类型是 Oracle 数据库管理系统中的数据类型,用于存储和管理数据,而 JDBC(Java Database Connectivity)类型是 Java 语言中用于连接数据库的 API 中的数据类型。了解 Oracle 数据类型和对应的 JDBC ...

    oracle中TIMESTAMP与DATE比较.docx

    Oracle 数据库中 TIMESTAMP 与 DATE 两个数据类型都是用于存储日期和时间的,但是它们之间有着很大的区别。在本文中,我们将详细比较这两个数据类型的特点、使用场景和优缺点。 DATE 数据类型 DATE 数据类型是 ...

    oracle-java数据类型1

    在 Oracle 数据库与 Java 应用程序交互时,理解 SQL 数据类型和它们对应的 JDBC 类型以及 Oracle 扩展的 Java 类型是至关重要的。这里我们将深入探讨这些概念,并提供一个全面的指南。 首先,JDBC(Java Database ...

    Oracle与.Net 数据类型映射

    同时,还需要注意数据的格式化和转换,以确保与Oracle数据库的兼容性。 例如: ```csharp OracleCommand cmd = new OracleCommand("INSERT INTO MyTable (MyNumber, MyDate, MyVarChar2) VALUES (:num, :dt, :str)...

    各大数据库类型与JDBC中介数据类型的转换对比

    因此,在进行跨数据库开发时,开发者需要特别注意这些细节,以确保数据的正确性和一致性。 此外,JDBC提供了标准的类型映射机制,这使得开发者能够更容易地编写兼容多数据库的应用程序。例如,当处理整数类型时,...

    3小时学会Mysql and JDBC数据库

    在本资源中,我们将讨论 MySQL 和 JDBC 数据库相关的知识点,涵盖数据库的基本概念、 MySQL 的基本操作、数据库的设计和 MySQL 的数据类型等方面。 一、数据库的基本概念 * 数据库是用于存储和管理数据的软件系统...

    Timestamp与Date互转.docx

    Timestamp与Date互转 在Java编程中,Timestamp和Date是两...需要注意的是,在进行类型转换时,需要考虑时间的格式和时区问题,以免出现时间错乱的问题。在实际开发中,我们需要根据具体情况选择合适的时间格式和时区。

    java、mysql以及oracle数据类型对照表

    值得注意的是,Oracle的DATE类型包含了日期和时间,而MySQL通常需要单独的DATE和TIME类型来处理日期和时间。 Java与数据库交互时,通常使用PreparedStatement和ResultSet接口,它们将Java对象转换为数据库数据类型...

    Oracle和DB2的数据类型比较

    由于Oracle和DB2/400在数据类型的定义和实现上存在差异,因此在进行数据库迁移或跨平台开发时,了解这些差异至关重要。 #### 二、日期和时间类型 - **Oracle DATE**: 包含年、月、日、时、分、秒等信息。 - **DB2/...

    oracle中TIMESTAMP与DATE比较.pdf

    Oracle数据库中的`DATE`和`TIMESTAMP`是两种常见的日期和时间数据类型,它们在处理时间信息时有着不同的特性和用途。 首先,`DATE`数据类型是我们最常使用的,它可以存储日期和时间,包括世纪、年、月、日、小时、...

    oracle数据类型和对应的JDBC类型.docx

    当我们在 Java 应用程序中操作 Oracle 数据库时,了解这些映射关系至关重要。以下是对 Oracle 数据类型和对应的 JDBC 类型的详细说明: 1. **数值类型**: - `NUMBER(p,s)`:Oracle 的通用数值类型,可以存储整数...

    oracle数据库索引失效

    Oracle数据库索引失效是一个常见的性能问题,它可能导致查询效率降低,影响系统的整体性能。索引失效可能是由多种原因引起的,理解这些原因并采取适当的预防措施至关重要。 首先,当WHERE子句中的条件筛选出的数据...

    Oracle与DB2数据类型的分类对应说明

    因此,在将 Oracle 的 DATE 类型转换为 DB2 的 DATE 类型时,需要将时、分、秒部分删除。同时,DB2 的 TIME 类型包含时、分、秒,可以与 Oracle 的 TIMESTAMP 类型对应。 在数据类型转换时,需要注意以下几点: * ...

    oracle --timestamp

    在Oracle数据库中,`TIMESTAMP`是一种用于存储日期和时间的数据类型,它可以精确到毫秒级别。`TIMESTAMP`数据类型不仅包含了日期和时间,还包含了时区信息,这对于处理全球性的业务非常重要。 #### 2. 创建表并插入...

    有关java中的Date,String,Timestamp之间的转化问题

    Java 中的 Date、String 和 Timestamp 之间的转换问题 Java 中的日期和时间处理是编程中非常重要的一方面,Date、String 和 ...Java 中的日期和时间处理需要注意不同类型之间的转换问题,以避免出现奇怪的结果。

Global site tag (gtag.js) - Google Analytics