java简单日期模式到oracle sql日期模式

java simple date pattern TO oracle sql date pattern

我有以下网络应用程序:
用户可以输入java简单日期格式模式和日期(当然与java简单日期格式模式匹配),我想将这些日期存储在oracle数据库中。

因此,我需要将java简单日期格式模式转换为oracle模式。
例如:

  • "dd-MM-yyyy HH:mm:ss"变为"DD-MM-YYYY HH24:MI:SS"
  • "dd-MM-yy HH:mm:ss"变为"DD-MM-YY HH24:MI:SS"
  • "dd-MM-yy HH:mm"变为"DD-MM-YY HH24:MI"

等等。

只需拥有一个SimpleDateFormat而不是以下代码,我想将所有或至少一大堆SimpleDateFormatPatterns转换为Oracle模式:

1
2
SimpleDateFormat sFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
String sqlSnippet ="TO_DATE('" + sFormat.format(date) +"','DD-MM-YYYY HH24:MI:SS')";

是否有一个库或者只是一个映射列表来执行此操作?

谢谢。

编辑:
我需要手动构建SQL,因为用户定义了条件,比较了用户界面中的运算符和连接。
最后我有这样的事情

1
AND col2 > TO_DATE('26-09-2012','DD-MM-YYYY')


Therefore I need to translate the java simple date format pattern into the oracle pattern

不,你没有。您应该使用PreparedStatement,并在其上调用setDatesetTimestamp来指定您感兴趣的值。

避免使用字符串转换,除非它们基本上是您尝试执行的操作的一部分(例如,在UI中显示日期/时间)。要简单地将信息从您的应用程序传输到您的数据库,反之亦然,您应该尽可能减少所需的转换次数。


Jon Skeet的回答是正确的,但现在引用一些遗留类已经过时了。 java.sql.Datejava.sql.Timestamp及相关类现在分别由java.time类LocalDateInstant取代。但是你的问题需要LocalDateTime类。

智能对象,而不是哑弦

您反对表示您的日期时间值。从JDBC 4.2及更高版本开始,您可以直接与数据库交换java.time对象。

您的输入缺少任何时区指示或从UTC偏移。因此,在Java中将其解析为LocalDateTime,以便在类似于SQL-standard TIMESTAMP WITHOUT TIME ZONE的类型的列中进行存储。

1
2
3
DateTimeFormatter f1 = DateTimeFormatter.ofPattern("dd-MM-uuuu HH:mm:ss" ) ;
DateTimeFormatter f2 = DateTimeFormatter.ofPattern("dd-MM-uu HH:mm:ss" ) ;
DateTimeFormatter f3 = DateTimeFormatter.ofPattern("dd-MM-uu HH:mm" ) ;

按输入字符串的长度选择格式化程序。

1
LocalDateTime ldt = LocalDateTime.parse( myInputString , f2 ) ;

I need to build the SQL by hand as the user defines the criteria, compare operators and joins in the user interface. In the end I have something like this

String sqlSnippet ="TO_DATE('" + sFormat.format(date) +"','DD-MM-YYYY HH24:MI:SS')";

不,不要将日期时间值作为文本嵌入到SQL字符串中。而是使用PreparedStatement替换为LocalDateTime对象的?占位符。

1
String sql ="SELECT when FROM tbl WHERE when > ? ;" ;

在运行时将要滑动的对象传递给该占位符。

1
myPreparedStatement.setObject( … , ldt ) ;

恢复:

1
LocalDateTime ldt = myResultSet.getObject(; LocalDateTime.class ) ;

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧遗留日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。

您可以直接与数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC驱动程序。不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

  • Java SE 8,Java SE 9及更高版本

    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小功能和修复。
  • Java SE 6和Java SE 7

    • 许多java.time功能都被反向移植到Java 6& 7在ThreeTen-Backport。
  • Android的

    • 更高版本的Android捆绑java.time类的实现。
    • 对于早期的Android(<26),ThreeTenABP项目采用ThreeTen-Backport(如上所述)。请参见如何使用ThreeTenABP ....

ThreeTen-Extra项目使用其他类扩展了java.time。该项目是未来可能添加到java.time的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuarter等。