JDBC 中查询 Oracle 数据库的日期范围(Java 中)
String sql="select id from period where '"+systemDate+"' between startDate and endDate";
我需要执行这个查询,并且我使用的是 Oracle 10g。我想获取这些日期之间的 id
。我面临的问题是在 Oracle 中,我的日期格式是“dd-mon-yy”,而 systemDate
的格式是“yyyy-mm-dd”。那么有没有办法将Java日期转换为dd-mon-format或任何其他方式来执行上述查询?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您应该将 java.util.Date 转换为 java.sql.Date 并使用PreparedStatement,如下所示:
You should convert your java.util.Date to a java.sql.Date and use a PreparedStatement as shown below:
Java 有日期格式化类。
DateFormat
是这些的抽象父类,SimpleDateFormat
这里 可能是你想要的,我还没有测试过。格式调用可能需要新的字符串缓冲区作为参数,并且我的格式字符串可能会关闭,但这就是想法。阅读文档
Java has date formatting classes.
DateFormat
is the abstract parent class for these,SimpleDateFormat
here is probably the one you wantI havent tested this. The format call might need new string buffers as arguments, and my format string could be off, but this is the idea. Read the documentation
更新:其他答案现已过时。现代解决方案使用 JSR 310 中定义的 java.time 类。它们取代了存在严重缺陷的遗留日期时间类,例如
Date
、Calendar
和SimpleDateFormat
。使用参数编写 SQL。使用
?
作为运行时传入的值的占位符。使用文本块以便于阅读。
切勿在日期时间工作中使用 SQL 命令
BETWEEN
。时间跨度最好使用半开放方法来定义,其中开始包含,而结束排除。相反,BETWEEN
是完全封闭的,以包含两个端点。例如,一个月从该月的第一天开始,一直持续到(但不包括)下个月的第一天。你说:
不,不正确。
DATE
列不是文本。所以它没有“格式”。你说:
在 Java 中,使用日期时间对象来保存日期时间值。日期时间对象不是文本,因此它们没有“格式”。
如果将一些文本作为输入日期,则解析为
java.time.LocalDate
对象。您指定的格式符合 ISO 8601 标准。默认情况下,java.time 类中使用该标准来生成/解析文本。因此无需指定格式模式。将这些对象作为要替换 SQL 语句中
?
占位符的值传递。Update: Other Answers are now outdated. The modern solution uses the java.time classes defined in JSR 310. These supplanted the terribly flawed legacy date-time classes such as
Date
,Calendar
, andSimpleDateFormat
.Write your SQL using parameters. Use
?
as a placeholder for the value to be passed in at runtime.Use text blocks for easier reading.
Never use the SQL command
BETWEEN
in date-time work. Spans of time are best defined using the Half-Open approach, where the beginning is inclusive while the ending is exclusive. In contrast,BETWEEN
is fully closed, to include both endpoints. For example, a month starts on the first of the month and runs up to, but does not include, the first of the following month.You said:
No, incorrect. A
DATE
column in Oracle database is not text. So it has no “format”.You said:
In Java use date-time objects to hold date-time values. Date-time objects are not text, so they have no “format”.
If handed some text as your input date, parse as a
java.time.LocalDate
object. Your specified format complies with ISO 8601 standard. That standard is used by default in the java.time classes for generating/parsing text. So no need to specify a formatting pattern.Pass these objects as the values to be substituted for the
?
placeholders in our SQL statement.