将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

下一篇: 00600 exception in Oracle