繁体   English   中英

java.sql.date,java.sql.timestamp谓词-> Oracle分区数据类型

[英]java.sql.date , java.sql.timestamp predicate -> Oracle partition data type

嗨,我们有一个很大的Oracle列对象,并用DATE数据类型对其进行了分区

其中一个分区看起来像这样:

GCP_P1  TO_DATE(' 2011-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 83  M_DATA01    DISABLED    348132  15214   146 08.06.2014 02:20:40 1078    0

每个分区为期一周。

我们使用jdbc通过瘦客户端运行sql。 没有ORM只是纯jdbc。

当我们用于分区列的谓词项是java.sql.timestamp时,我们意识到查询不会从分区中受益。 但是,当类型为java.sql.date时,执行计划将显示成功的分区访问。

因此,例如我们的sql看起来像这样:

SELECT COUNT(1) FROM ATABLE WHERE PARTITIONED_COLUMN > ?

当我们的java语句是:

preparedStatement.setDate(...); // it benefits from partition

但是当这样的时候:

preparedStatement.setTimestamp(...); //it does not benefits from partition

我正在从蟾蜍那里看它们。 我经历过,当它是java.sql.date时,它在oracle上被解释为DATE,当它是java.sql.timestamp时,它被解释为TIMESTAMP

我正在使用以下SQL语句跟踪捕获的JDBC日期类型

SELECT *
  FROM V$SQL_BIND_CAPTURE
WHERE WAS_CAPTURED = 'YES' AND LAST_CAPTURED BETWEEN SYSDATE-1/50 AND SYSDATE
ORDER BY LAST_CAPTURED DESC;

我的问题是您遇到过这样的问题吗? 如果是这样,您可以指导我处理一些文件。

您描述的案例记录在第8节“映射JDBC API入门”的 SQL和Java类型中

8.3.12日期,时间和时间戳

因为标准Java类java.util.Date与这三种JDBC日期/时间类型中的任何一种都不完全匹配(它既包含DATE和TIME信息,又没有纳秒),所以JDBC定义了java.util.Date的三个子类来对应SQL类型。 他们是:

java.sql.Date

有关SQL DATE的信息。 java.util.Date基类的小时,分​​钟,秒和毫秒字段应设置为零。 如果提供给java.sql.Date构造函数的毫秒数为负,则驱动程序将日期计算为1970年1月1日之前的毫秒数。否则,日期将计算为1月1日之后的指定毫秒数。 1970年。

的java.sql.Time

SQL TIME信息。 java.util.Date基类的年,月和日字段设置为1970,一月和1。这是Java时代中的“零”日期。

的java.sql.Timestamp

有关SQL TIMESTAMP的信息。 此类通过添加一个nanoseconds字段来扩展java.util.Date。

oracle jdbc开发人员指南包含从jdbc类型到oracle数据类型的映射。 由于其复杂性,有一部分专门针对DATE数据类型。 它具有以下注意事项:

在Oracle数据库11g中,如果在DATE列上有一个索引供SQL查询使用,则为了获得更快,更准确的结果,必须按以下方式使用setObject方法:

 Date d = parseIsoDate(val); 
 Timestamp t = new Timestamp(d.getTime());
 stmt.setObject(pos, new oracle.sql.DATE(t,(Calendar)UTC_CAL.clone()));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM