在 Java 中查询 Oracle 数据库时 JDBC 中的日期范围

问题描述 投票:0回答:3

String sql="从起始日期和结束日期之间的'"+systemDate+"'期间选择id";

我需要执行这个查询,我使用的是oracle 10g。我想获取这些日期之间的 id。我面临的问题是在 Oracle 中,我的日期格式是“dd-mon-yy”,而 systemDate 的格式是 yyyy-mm-dd。那么有没有办法将java日期转换为dd-mon-format或任何其他方式来执行上述查询?

jdbc oracle10g
3个回答
2
投票

您应该将 java.util.Date 转换为 java.sql.Date 并使用PreparedStatement,如下所示:

java.util.Date jStartDate = ...; //your "java" date object
java.sql.Date startDate = new java.sql.Date(jStartDate.getTime());

java.util.Date jEndDate = ...;
java.sql.Date endDate = new java.sql.Date(jEndDate.getTime());

PreparedStatement p = connection.prepareStatement("select id from period where systemDate between ? and ?");
p.setDate(1, startDate);
p.setDate(2, endDate);
ResultSet rs = p.executeQuery();

0
投票

Java 有日期格式化类。

DateFormat
是这些的抽象父类,
SimpleDateFormat
这里可能是你想要的

SimpleDateFormat oracleStyle = new SimpleDateFormat("dd-MM-yy");
String dString = oracleStyle.format(systemDate);
String sql="select id from period where '"+systemDate+"' between startDate and endDate";

我还没有测试过这个。格式调用可能需要新的字符串缓冲区作为参数,并且我的格式字符串可能会关闭,但这就是想法。阅读文档


0
投票

更新:其他答案现已过时。现代解决方案使用 JSR 310 中定义的 java.time 类。它们取代了存在严重缺陷的遗留日期时间类,例如

Date
Calendar
SimpleDateFormat

使用参数编写 SQL。使用

?
作为运行时传入的值的占位符。

使用文本块更容易阅读。

切勿在日期时间工作中使用 SQL 命令

BETWEEN
。时间跨度最好使用“半开放”方法来定义,其中开始是“包容”,而结束是“排除”。相反,BETWEEN 是完全闭合的,以包含两个端点。例如,一个月从该月的第一天开始,一直到(但不包括)下个月的第一天。 String sql = """ SELECT id_ FROM event_ WHERE NOT ( date_ < ? ) AND date_ < ? ; """ ; 你说:

oracle 我的日期格式是“dd-mon-yy”

不,不正确。 Oracle 数据库中的

DATE

列是
不是

文本。所以它没有“格式”。

你说:
系统日期的格式为 yyyy-mm-dd。

在 Java 中,使用日期时间对象来保存日期时间值。日期时间对象不是文本,因此它们没有“格式”。

如果将一些文本作为输入日期,则解析为

java.time.LocalDate

对象。您指定的格式符合 ISO 8601 标准。默认情况下,在

java.time

类中使用该标准来生成/解析文本。因此无需指定格式模式。

LocalDate start = LocalDate.parse( "2024-01-01" ) ;
LocalDate end = start.plusMonths( 1 ) ; // Cover month of January of 2024.
将这些对象作为要替换 SQL 语句中的 ? 占位符的值传递。

myPreparedStatement.setObject( 1 , start ) ;
myPreparedStatement.setObject( 2 , end ) ;


© www.soinside.com 2019 - 2024. All rights reserved.