static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd- MMM-yyyy");
static String date = simpleDateFormat.format(new Date());
private static final String SELECT_BY_AUDIT_KEY_QUERY = "SELECT * FROM
t02 WHERE t02_create_date = " + date;
输出为:
SELECT * FROM t02_transaction_log WHERE t02_create_date = 03-Jul-2018
这是我想要的:
SELECT * FROM t02_transaction_log WHERE t02_create_date = '03-Jul-2018'
我该如何获得单引号之间的日期?
答案 0 :(得分:5)
您应该在此处使用准备好的语句:
String sql = "SELECT * FROM t02 WHERE t02_create_date = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setDate(1, new Date());
ResultSet rs = ps.executeQuery();
while (rs.next()) {
// process result set
}
虽然语句对于防止诸如SQL注入之类的事情很重要,但它们同样有用,因为它们使您不必担心格式化查询中的详细信息。在上面的查询字符串中,我们只用?
占位符表示日期,然后让驱动程序处理将当前日期编组为要发送给Oracle的正确格式。
答案 1 :(得分:1)
获取单引号之间的日期?
不要。您应该使用智能对象(而不是哑字符串)与数据库交换日期值。
使用 java.time 类替换麻烦的旧类。
对于仅日期的值,请使用LocalDate
类代替java.sql.Date
。
myPreparedStatement.setObject(
… ,
LocalDate.of( 2018 , Month.JANUARY , 23 )
)
…和检索…
myResultSet.getObject(
… ,
LocalDate.class
)
Answer by Tim Biegeleisen是正确的,但是使用了麻烦的旧类。 java.util.Date
,java.sql.Date
,SimpleDateFormat
和相关的旧日期时间类在几年前被 java.time 类所取代。
从JDBC 4.2和更高版本开始,我们可以直接与数据库交换 java.time 对象。使用PreparedStatement::setObject
和ResultSet::getObject
方法。
如果您的数据库列属于仅日期类型,而没有日期和时区,则类似于SQL标准的DATE
类型,请使用LocalDate
类。示例代码:
LocalDate localDate = LocalDate.of( 2018 , Month.JANUARY , 23 ) ; // 2018-01-23.
String sql = "SELECT * FROM t02 WHERE t02_create_date = ? ;" ; // Tip: Make a habit of closing your SQL properly with a semicolon. Won't hurt, and might help.
PreparedStatement ps = conn.prepareStatement( sql ) ;
ps.setObject( 1 , localDate );
ResultSet rs = ps.executeQuery();
while (rs.next()) {
LocalDate ld = rs.getObject( 1 , LocalDate.class ) ; // Retrieve an `LocalDate` class.
}
如果您的数据库列是带日期的日期类型,类似于SQL标准的TIMESTAMP WITH TIME ZONE
类型,请使用Instant
类。示例代码:
LocalDate instant = LocalDate.of(
String sql = "SELECT * FROM t02 WHERE t02_create_date = ? ;" ; // Tip: Make a habit of closing your SQL properly with a semicolon. Won't hurt, and might help.
PreparedStatement ps = conn.prepareStatement( sql ) ;
ps.setObject( 1 , instant );
ResultSet rs = ps.executeQuery();
while (rs.next()) {
Instant instantRetrieved = rs.getObject( 1 , Instant.class ) ; // Retrieve an `Instant` class.
// You may want to adjust from UTC to some other time zone.
ZoneID z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instantRetrieved.atZone( z ) ; // Same moment, same point on the timeline, different wall-clock time as seen by the people of some particular region (a time zone).
}
java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
目前位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
在哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。
答案 2 :(得分:0)
尝试一下
private static final String SELECT_BY_AUDIT_KEY_QUERY = "SELECT * FROM
t02 WHERE t02_create_date = to_date('" + date + "', 'dd-mon-yyyy')";