【问题标题】:how to convert java.util.Date to the format accepted by oracle?如何将 java.util.Date 转换为 oracle 接受的格式?
【发布时间】:2017-07-13 21:25:52
【问题描述】:

我想在接受日期参数的存储过程中将日期作为参数传递。我的 oracle db 接受的日期格式,例如 10-JUL-17

现在我试过了

SimpleDateFormat df = new SimpleDateFormat("dd-MMM-yy");
Date d = new Date();
String newdate = df.format(d);
System.out.println(newdate);

它打印 13-JUL-17 但由于它是字符串,我的表不会接受这个值。 我如何将其转换为日期数据类型,以便 oracle 接受它。

【问题讨论】:

  • Dates 没有格式。如果您的 Oracle 数据库需要 Date 对象,则格式无关紧要。也许您的 Oracle 代码有问题,但尚未发布。
  • 也许这有帮助? stackoverflow.com/a/31238011/4273199
  • 除了其他人建议的所有转换之外,我会将日期标记为查询参数(即使用?)并使用 JDBC 驱动程序方法来提供相关的 Java 对象(即 Date , 时间戳等)
  • 一个DATE does not have a format;它在内部存储为 7 或 8 字节,代表年(2 字节)、月、日、小时、分钟和秒(每个 1 字节)。您使用的用户界面(SQL/Plus、SQL Developer、Toad、Java 等)通常会将格式应用于日期,以便人类可读,但这不是由数据库完成的。 SQL/Plus 和 SQL Developer 使用的格式是 NLS_DATE_FORMAT 会话参数,该参数存储在数据库中,但任何用户都可以独立更改自己的设置。

标签: java oracle


【解决方案1】:

如果你想为给定的日期值设置一个参数,你应该使用你的PreparedStatement 实例的setDate() 方法。

但是这个方法需要一个java.sql.Date实例,如果你的日期是java.util.Date,那么你必须转换它:new java.sql.Date(java_util_date.getTime());

EG:

try ( PreparedStatement ps = con.prepareStatement( "SELECT * FROM table WHERE dat >= ?" ))
{
  ps.setDate(1, new java.sql.Date( System.currentMillis() ) );
  try ( ResultSet rs = ps.executeQuery() )
  {
    while ( rs.next() )
    {
      // process the row in rs
    }
  }
}

编辑

对于存储过程,在 SQL 查询中使用以下语法:

{call stored_procedure(?)}

此外,如果您的存储过程不返回ResultSet,请使用executeUpdate() 而不是executeQuery()...
(如果我没记错的话,call 关键字存在一些问题,尤其是在这种情况下。如果call 不起作用,请尝试CALL...)

【讨论】:

  • 对我来说不管是 java.util.Date 还是 java.sql.Date 我只需要以 13-JUL-17 格式插入当前日期
  • Java 日期没有格式,但可以设置为 JDBC 参数。
  • 我如何对存储过程做同样的事情?
  • @sagarlimbu 只需使用 CallableStatement 而不是 PreparedStatement 并在其上设置绑定参数。
【解决方案2】:

Oracle 中没有Date 字段的格式。只要 DB 字段的数据类型是 Date 并且您将值传递为 Date 它应该可以工作。如果您将日期作为String 传递,那么您的sql 将不得不使用TO_DATE 函数来转换该值。尝试将您的日期值转换为java.sql.Date,然后再将其传递给存储过程。

【讨论】:

    【解决方案3】:

    您可以使用 TO_TIMESTAMP 将 CHAR、VARCHAR2、NCHAR 或 NVARCHAR2 数据类型的 char 转换为 TIMESTAMP 数据类型的值。

    【讨论】:

      【解决方案4】:

      如果你使用实体来绑定你的数据,简单

      @Column(name = "DATE")
      @Temporal(TemporalType.TIMESTAMP)
      private Date date;
      

      会的

      【讨论】:

        【解决方案5】:

        使用TO_DATE 函数。例如:

        INSERT INTO SOME_TABLE
          (NUMBER_FIELD, TEXT_FIELD, DATE_FIELD)
        VALUES
          (1,            'ABC',      TO_DATE(:p1, 'DD-MON-RR'))
        

        You can find the docs for the TO_DATE function heredocumentation for date format strings here

        祝你好运。

        【讨论】:

          【解决方案6】:

          完全同意其他cmets和建议的答案:

          • 使用PreparedStatementsetDate() 格式化为Date
          • 使用其他标准 JDBC 驱动程序函数
          • 意识到所有这些都取决于语言环境

          但是,一些老 Cobol 程序员(对 Java 或 Date 一无所知)告诉我,您可以使用格式为 DDMMMYYYYString

          Oracle 11g 可以接受以下内容,使用 en-US 语言环境:

          UPDATE table_name
             SET date_field = '10JUL2017'
           WHERE id = 1;
          

          【讨论】:

            猜你喜欢
            • 2018-03-06
            • 2018-09-23
            • 1970-01-01
            • 1970-01-01
            • 2021-02-25
            • 2014-08-25
            • 1970-01-01
            • 2020-11-02
            • 1970-01-01
            相关资源
            最近更新 更多