尝试使用 jdbc、SimpleDateFormat 插入数据库时日期中的年份不正确
Incorrect year in the date when trying to insert in database using jdbc, SimpleDateFormat
我一直在尝试使用 JDBC、SimpleDateFormat API 将日期插入 Oracle 数据库。
当我将日期传递为“2016-07-24”时,它插入为错误的“24-JUL-24”(年份错误),它应该是“24-JUL-16”。它发生在第 n 次。尽管我尝试反复插入数据,但我无法调试代码。
任何人都可以参考下面的代码、数据库架构和日期格式,如果我哪里错了请告诉我。谢谢。
DAO 程序
package com.oog.big.database;
import java.sql.Connection;
import java.sql.PreparedStatement;
import com.oog.big.database.DBConnection;
import java.text.SimpleDateFormat;
public class ItemDetailsDAO {
// format for date
public static final SimpleDateFormat transactionDateFormat = new SimpleDateFormat(
"yyyy-MM-dd");
public static transient final SimpleDateFormat requestDateTimeFormat = new SimpleDateFormat(
"yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
private static final String insertTableSQL = "INSERT INTO ITEM_DETAILS ("
+ " ITEM_ID ,"
+ " SRV_NAME ,"
+ " INS_TYPE ,"
+ " REQ_CONTEXT ,"
+ " STATUS_FLAG ,"
+ " CHL ,"
+ " TRANSACTION_DATE ,"
+ " REQ_DATETIME ,"
+ " FLAG )" + "values(?,?,?,?,?,?,?,?,?)";
public static void save() throws Exception {
Connection con = null;
PreparedStatement stmt = null;
try {
con = DBConnection.getConnection();
con.setAutoCommit(true);
stmt = con.prepareStatement(insertTableSQL);
stmt.setInt(1, 1256);
stmt.setString(2, "DD");
stmt.setString(3, "OL");
stmt.setString(4, "DP");
stmt.setString(5, "");
stmt.setString(6, "FF");
/** Incorrect Date **/
stmt.setDate(
7,
new java.sql.Date(transactionDateFormat.parse(
"2016-07-24").getTime()));
stmt.setDate(
8,
new java.sql.Date(requestDateTimeFormat.parse(
"2016-08-02T16:56:01.764-04:00").getTime()));
stmt.setString(9, "N");
stmt.execute();
stmt.close();
System.out.println("Completed!!");
} catch (Exception e) {
System.out.println("DB Error: "+e);
}
}
}
ITEM_DETAILS
的架构
CREATE TABLE OYD.ITEM_DETAILS
(
ITEM_ID INTEGER NOT NULL,
SRV_NAME VARCHAR2(5) DEFAULT NULL,
INS_TYPE VARCHAR2(3) DEFAULT NULL,
REQ_CONTEXT VARCHAR2(3) DEFAULT NULL,
REQ_DATETIME TIMESTAMP DEFAULT NULL,
STATUS_FLAG VARCHAR2(2) DEFAULT NULL,
CHL VARCHAR2(2) DEFAULT NULL,
TRANSACTION_DATE DATE DEFAULT NULL,
FLAG VARCHAR2(1) DEFAULT NULL,
LAST_UPDATE_TIMESTAMP TIMESTAMP DEFAULT SYSTIMESTAMP,
CONSTRAINT PK_ITEM_DETAILS PRIMARY KEY (ITEM_ID)
)
PARTITION BY RANGE (LAST_UPDATE_TIMESTAMP) INTERVAL (NUMTODSINTERVAL(1,'DAY'))
(
PARTITION P_ITEM_DETAILS VALUES LESS THAN (TO_DATE('07-MAR-2016','DD-MON-YYYY'))
)PARALLEL;
规格:
- JAVASE8
- Oracle 12c 数据库
- JDBC 连接器:ojdbc7-12.1.0.1.0.jar
您可以在 SQL.
中使用 Oracle 的日期函数,而不是使用 SimpleDateFormat 格式化日期
private static final String insertTableSQL = "INSERT INTO ITEM_DETAILS ("
+ " ITEM_ID,"
+ " SRV_NAME,"
+ " INS_TYPE,"
+ " REQ_CONTEXT,"
+ " STATUS_FLAG,"
+ " CHL,"
+ " TRANSACTION_DATE,"
+ " REQ_DATETIME,"
+ " FLAG)" + "values(?,?,?,?,?,?,TO_DATE(?,'DD-MON-RR'),TO_DATE(?,'DD-MON-RR'),?)";
public static void save(){
//.........
smtp.setString(7,"24-07-2016");
smtp.setString(8,"02-8-2016");
//.........
您甚至可以在 TO_DATE() 函数中格式化时间 (hh:mm:ss) 来存储时间戳。
我一直在尝试使用 JDBC、SimpleDateFormat API 将日期插入 Oracle 数据库。 当我将日期传递为“2016-07-24”时,它插入为错误的“24-JUL-24”(年份错误),它应该是“24-JUL-16”。它发生在第 n 次。尽管我尝试反复插入数据,但我无法调试代码。 任何人都可以参考下面的代码、数据库架构和日期格式,如果我哪里错了请告诉我。谢谢。
DAO 程序
package com.oog.big.database;
import java.sql.Connection;
import java.sql.PreparedStatement;
import com.oog.big.database.DBConnection;
import java.text.SimpleDateFormat;
public class ItemDetailsDAO {
// format for date
public static final SimpleDateFormat transactionDateFormat = new SimpleDateFormat(
"yyyy-MM-dd");
public static transient final SimpleDateFormat requestDateTimeFormat = new SimpleDateFormat(
"yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
private static final String insertTableSQL = "INSERT INTO ITEM_DETAILS ("
+ " ITEM_ID ,"
+ " SRV_NAME ,"
+ " INS_TYPE ,"
+ " REQ_CONTEXT ,"
+ " STATUS_FLAG ,"
+ " CHL ,"
+ " TRANSACTION_DATE ,"
+ " REQ_DATETIME ,"
+ " FLAG )" + "values(?,?,?,?,?,?,?,?,?)";
public static void save() throws Exception {
Connection con = null;
PreparedStatement stmt = null;
try {
con = DBConnection.getConnection();
con.setAutoCommit(true);
stmt = con.prepareStatement(insertTableSQL);
stmt.setInt(1, 1256);
stmt.setString(2, "DD");
stmt.setString(3, "OL");
stmt.setString(4, "DP");
stmt.setString(5, "");
stmt.setString(6, "FF");
/** Incorrect Date **/
stmt.setDate(
7,
new java.sql.Date(transactionDateFormat.parse(
"2016-07-24").getTime()));
stmt.setDate(
8,
new java.sql.Date(requestDateTimeFormat.parse(
"2016-08-02T16:56:01.764-04:00").getTime()));
stmt.setString(9, "N");
stmt.execute();
stmt.close();
System.out.println("Completed!!");
} catch (Exception e) {
System.out.println("DB Error: "+e);
}
}
}
ITEM_DETAILS
CREATE TABLE OYD.ITEM_DETAILS
(
ITEM_ID INTEGER NOT NULL,
SRV_NAME VARCHAR2(5) DEFAULT NULL,
INS_TYPE VARCHAR2(3) DEFAULT NULL,
REQ_CONTEXT VARCHAR2(3) DEFAULT NULL,
REQ_DATETIME TIMESTAMP DEFAULT NULL,
STATUS_FLAG VARCHAR2(2) DEFAULT NULL,
CHL VARCHAR2(2) DEFAULT NULL,
TRANSACTION_DATE DATE DEFAULT NULL,
FLAG VARCHAR2(1) DEFAULT NULL,
LAST_UPDATE_TIMESTAMP TIMESTAMP DEFAULT SYSTIMESTAMP,
CONSTRAINT PK_ITEM_DETAILS PRIMARY KEY (ITEM_ID)
)
PARTITION BY RANGE (LAST_UPDATE_TIMESTAMP) INTERVAL (NUMTODSINTERVAL(1,'DAY'))
(
PARTITION P_ITEM_DETAILS VALUES LESS THAN (TO_DATE('07-MAR-2016','DD-MON-YYYY'))
)PARALLEL;
规格:
- JAVASE8
- Oracle 12c 数据库
- JDBC 连接器:ojdbc7-12.1.0.1.0.jar
您可以在 SQL.
中使用 Oracle 的日期函数,而不是使用 SimpleDateFormat 格式化日期private static final String insertTableSQL = "INSERT INTO ITEM_DETAILS ("
+ " ITEM_ID,"
+ " SRV_NAME,"
+ " INS_TYPE,"
+ " REQ_CONTEXT,"
+ " STATUS_FLAG,"
+ " CHL,"
+ " TRANSACTION_DATE,"
+ " REQ_DATETIME,"
+ " FLAG)" + "values(?,?,?,?,?,?,TO_DATE(?,'DD-MON-RR'),TO_DATE(?,'DD-MON-RR'),?)";
public static void save(){
//.........
smtp.setString(7,"24-07-2016");
smtp.setString(8,"02-8-2016");
//.........
您甚至可以在 TO_DATE() 函数中格式化时间 (hh:mm:ss) 来存储时间戳。