Java中单引号内的当前日期

时间:2018-07-03 10:40:40

标签: java oracle

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'

我该如何获得单引号之间的日期?

3 个答案:

答案 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)

tl; dr

  

获取单引号之间的日期?

不要。您应该使用智能对象(而不是哑字符串)与数据库交换日期值。

使用 java.time 类替换麻烦的旧类。

对于仅日期的值,请使用LocalDate类代替java.sql.Date

myPreparedStatement.setObject( 
    … , 
    LocalDate.of( 2018 , Month.JANUARY , 23 ) 
)

…和检索…

myResultSet.getObject( 
    … ,
    LocalDate.class 
)

java.time

Answer by Tim Biegeleisen是正确的,但是使用了麻烦的旧类。 java.util.Datejava.sql.DateSimpleDateFormat和相关的旧日期时间类在几年前被 java.time 类所取代。

从JDBC 4.2和更高版本开始,我们可以直接与数据库交换 java.time 对象。使用PreparedStatement::setObjectResultSet::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.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

目前位于Joda-Timemaintenance 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中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

答案 2 :(得分:0)

尝试一下

 private static final String SELECT_BY_AUDIT_KEY_QUERY = "SELECT * FROM 
     t02 WHERE t02_create_date = to_date('" + date + "', 'dd-mon-yyyy')";