【发布时间】:2012-03-13 20:13:36
【问题描述】:
我想从 MsSql 和 Oracle 数据库中收集数据。因此我使用准备好的语句,因为我需要数据BETWEEN 的开始和结束日期。
给定数据库:
所以在MSSQL 我有这些专栏:
- 开始日期 --> 数据类型:
DATETIME - 结束日期 --> 数据类型:
DATETIME - 名称 --> 数据类型:
VARCHAR(100)
在Oracle 我有相同的列但其他数据类型:
- 开始日期 --> 数据类型:
Date - 结束日期 --> 数据类型:
Date - 名称 --> 数据类型:
VARCHAR2(100)
现在我想用下面的 Prepared SQL 语句来收集数据:
String taskSql = "" +
" SELECT startdate, enddate, name" +
" FROM TASKS" +
" WHERE startdate BETWEEN ? AND ?" +
" AND enddate BETWEEN ? AND ?";
这个数据库日期时间的东西一直让我感到困惑,每次我更改我的代码时它看起来都可以正常工作,但是在其他数据库上进行测试时它会中断。
我收集数据的 Java 代码:
Calendar cal = Calendar.getInstance();
cal.setTime(aEndDate);
cal.add(Calendar.HOUR, 23);
cal.add(Calendar.MINUTE, 59);
cal.add(Calendar.SECOND, 59);
Date endDate = cal.getTime();
java.sql.Timestamp sqlStartDate = new java.sql.Timestamp(startDate.getTime());
java.sql.Timestamp sqlEndDate = new java.sql.Timestamp(endDate.getTime());
System.out.println(sqlStartDate); // prints 2012-02-23 00:00:00.0
System.out.println(sqlEndDate); // prints 2012-02-23 23:59:59.0
PreparedStatement prepStatement = null;
ResultSet resultSet = null;
prepStatement = DB.getConnection().prepareStatement(taskSql);
prepStatement.setTimestamp(1, sqlStartDate);
prepStatement.setTimestamp(2, sqlEndDate);
prepStatement.setTimestamp(3, sqlStartDate);
prepStatement.setTimestamp(4, sqlEndDate);
resultSet = prepStatement.executeQuery();
不幸的是,我不使用 JodaTime,下一个项目我会使用,因为我已经阅读了有关该库的一些好东西。
我的问题/问题是:
- 我可以在 Java 中为 MSSQL 和 Oracle 数据库使用准备好的语句吗?
- 如何使用通用日期时间格式从两个数据库中收集日期时间? (或者我需要检测数据库类型并做一些特定的事情吗?
【问题讨论】:
-
请同时出示您的
taskSql。 -
编辑帖子以显示正确的 Sql 语句
-
尝试传入 java.sql.Dates 而不是 java.sql.Timestamps。
-
当我传入 java.sql.Dates 时,它不会按时搜索,只是日期,我也想要时间信息......因此我使用 BETWEEN。
-
你能尝试(在 oracle 上)这个语句:“select dump(?) from dual”并给它
java.sql.Timestamp(startDate.getTime())吗?如果您没有得到 ORA-00923,它可能有助于查看它是 typ=12(日期)还是 typ=180(时间戳)。你用的是什么神谕?
标签: java sql-server oracle datetime prepared-statement