【问题标题】:One prepared statement for MSSQL and Oracle for retrieving Dates?为 MSSQL 和 Oracle 准备的用于检索日期的语句?
【发布时间】: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


【解决方案1】:

谢谢大家,我正在监督自己的错误!我为我的开始日期添加了一个别名,并将这个别名命名为 'from' 。显然这是行不通的!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 2015-10-07
    相关资源
    最近更新 更多