簡體   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