将Oracle DATE列修改为TIMESTAMP时必须考虑的事项
我正在使用的系统使用的是oracle 11 db,并且有一个使用JDBC的java实现的后端。
该系统有一个主要的性能问题:
oracle数据库有索引DATE列,但java后端像这样访问数据库
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索引,但现在我失去了时间戳数据类型的准确性,并且只获得了java.sql.Date类型的日准确性。
因此,第一种解决方案对我的系统无法使用。
第二个方案
我不更改java后端,因此使用statement.setTimestamp并更改oracle db的所有DATE列,如以下sql命令示例所示:
ALTER TABLE <table_1> MODIFY <date_column> TIMESTAMP;
现在我的问题:
将Oracle DATE列修改为TIMESTAMP时必须考虑的事项
我认为重要方面的清单将是完美的。
这里是我的第一份“将Oracle DATE列迁移到TIMESTAMP的清单”
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数据的输出typ DATE 05.11.2014 00:00:00 crea_time数据的输出typ 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数据类型的输出typ TIMESTAMP ORA-01830:01830. 00000 - “日期格式图片在转换整个输入字符串之前结束”*原因:
*操作:解决方案>>>从表中选择TRUNC(TO_TIMESTAMP(crea_time),'YEAR'); crea_time数据输出类型TIMESTAMP 01.01.2014 00:00:00
9.添加一天/小时/分钟/秒
select crea_time+1 from table;
输出数据典型日期06.11.2014 14:06:12
输出数据类型TIMESTAMP 06.11.2014 14:06:12
10. MIN()/ MAX()
SELECT MIN(crea_time) FROM table;
输出数据典型日期05.11.2014 14:06:12输出数据类型TIMESTAMP 05.11.2014 14:06:12,000000000
请原谅我糟糕的英语。
链接地址: http://www.djcxy.com/p/6301.html上一篇: What must be considered when modifying Oracle DATE column to TIMESTAMP