我正在使用的系统使用oracle 11 db并且有一个使用JDBC的java实现的后端。
系统存在一个主要性能问题:
oracle db索引了DATE列,但java后端像这样访问db
String sql = "SELECT foo FROM bar WHERE a_date > ?";
// ... prepare the statement
statement.setTimestamp(1, new Timestamp());
然后由于statement.setTimestamp,Oracle不会使用索引并回退到全表扫描。
第一个解决方案:
所以我已经将后端的访问权限从 statement.setTimestamp 更改为 statement.setDate 。 性能已得到改进,现在使用了DATE索引,但现在我丢失了timestamp数据类型的准确性,并且只获得了java.sql.Date类型的日精度。
因此,第一个解决方案对我的系统无法使用。
第二个解决方案:
我不使用 statement.setTimestamp 更改java后端,并更改oracle db的所有DATE列,如下面的sql命令示例所示:
ALTER TABLE <table_1> MODIFY <date_column> TIMESTAMP;
现在我的问题:
将Oracle DATE列修改为TIMESTAMP
时必须考虑的因素我认为重要方面的清单是完美的。
这是我将Oracle DATE列迁移到TIMESTAMP的&#34; CHECKLIST的初稿
1。创建/插入
2。阅读/选择
第3。更新/更新
4。删除/删除
5。 TO_DATE()
select * from table where crea_time between TO_DATE( '10.2014', 'MM.yyyy' ) and TO_DATE( '12.2014', 'MM.yyyy' ) ;
6。 TRUNC()
select TRUNC( crea_time ) from table;
输出crea_time数据类型DATE 05.11.2014 00:00:00 输出crea_time数据类型TIMESTAMP 05.11.2014 00:00:00
7。 TO_CHAR()
select to_char( crea_time,'hh24miss' ) from table;
输出数据类型DATE 140612 输出数据典型TIMESTAMP 140612
8。 NESTED - TRUNC(TO_DATE())
select TRUNC(TO_DATE( crea_time), 'YEAR') from table;
输出crea_time数据类型DATE
01.01.2014 00:00:00
输出crea_time数据类型TIMESTAMP
ORA-01830:
01830. 00000 - &#34;日期格式图片在转换整个输入字符串之前结束&#34;
*原因:
*行动:
解决方案&gt;&gt;&gt;从表中选择TRUNC(TO_TIMESTAMP(crea_time),&#39; YEAR&#39;);
输出crea_time数据类型TIMESTAMP
01.01.2014 00:00:00
9。添加一天/小时/分钟
select crea_time+1 from table;
输出数据类型DATE 06.11.2014 14:06:12
输出数据类型为TIMESTAMP 06.11.2014 14:06:12
10。 MIN()/ MAX()
SELECT MIN(crea_time) FROM table;
输出数据类型DATE 05.11.2014 14:06:12 输出数据典型TIMESTAMP 05.11.2014 14:06:12,000000000
请原谅我的英语不好。