我有两列将 DateTime 值存储在 MySql 数据库中,
当我尝试从 Java 的 ResultSet 中获取它们时,没有选项:
getDateTime()
我应该使用getDate()
还是不起作用?
提前致谢
使用getDate()
仅返回 a Date
,因此在您的情况下,如果您希望同时使用日期和时间getTimestamp(String columnLabel)
- 这应该有效,也可以替换String columnLabel
为数据库中的实际列名。
首先,如果数据库中的日期时间要表示一个时间点,请使用timestamp
MySQL 中的数据类型,而不是datetime
. Adatetime
可以解释为读者或阅读它的程序碰巧使用的任何时区。这可能会导致难以调试的错误。timestamp
数据类型在各种 RDBMS 中表现不同。在 MySQL 中,它确保日期和时间采用 UTC,从而排除对任何其他时区的错误解释。它更安全。如果您所在时区的用户在数据库中读取日期和时间有点困难,那是值得的。
PreparedStatement ps = yourDatabaseConnection.prepareStatement("select your_datetime_col from your_table;");
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
OffsetDateTime dateTime = rs.getObject("your_datetime_col", OffsetDateTime.class);
// do something with dateTime
}
}
用于ResultSet.getObject()
将数据库中的日期和时间检索为来自 java.time(现代 Java 日期和时间 API)的类型。问题和其他答案中提到或暗示的 classes 都设计不佳且早已过时,因此我推荐使用java.sql.Timestamp
现代API java.sql.Date
。java.util.Date
它需要符合 JDBC 4.2 的驱动程序。我们大多数人都有这种情况,其中一个人已经使用 MySQL 很多年了。所以我希望你没事。
如果您无法更改 MySQL 中的数据类型,请使用Java 从列LocalDateTime
中检索值。datatime
它的运行方式与上面的代码相同。
我应该使用
getDate()
还是不起作用?
不,它不会。getDate()
只为您提供java.sql.Date
数据库中的日期部分,一天中的时间部分将丢失。正如我所说,java.sql.Date
设计也很糟糕——在已经设计得很糟糕的基础上进行真正的破解java.util.Date
——所以无论如何你都不应该想要这样。
或者使用从日期到字符串的类型转换:
resultSet.getDate(1).toString());
将返回:
2014-02-18
DB字段数据:“2014-02-18 00:00:00.000”
转换
java.sql.Timestamp
为java.util.Date
.
java.util.Date date = rs.getDate(index_position); // O/P: DD:MM:YYYY
java.sql.Timestamp timestamp = rs.getTimestamp(index_position); // O/P: DD:MM:YYYY HH:mm:ss
java.util.Date date = new java.util.Date(timestamp.getTime());
如果您将时间戳记为日期并将其转换为,java.sql.Timestamp
那么它会导致DD:MM:YYYY 00:00:00
日期不包括时间。因此,它选择默认为00:00:00
.
SQL TimeStamp : 30.12.2020 13.40.50
Java TimeStamp : 30.12.2020 13.40.50
SQL TimeStamp : 30.12.2020 13.40.50
Java Date : 30.12.2020 00.00.00
Java TimeStamp : 30.12.2020 00.00.00
获取基于ResultSetMetaData
CSV 报告的记录的示例:
public static void getTestTable(Connection con) throws SQLException {
String sql = "select ID, INSERTDATE, TO_CHAR(INSERTTIME,'DD.MM.YYYY HH24:MI:SS') as String_Time, INSERTTIME, MSG from TEST_TABLE group by ID, INSERTDATE, INSERTTIME, MSG";
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(sql);
if (rs != null) {
ResultSetMetaData resultSetMetaData = rs.getMetaData();
int noOfColumns = resultSetMetaData.getColumnCount(); // For iteration
System.out.println("No of Cloumns Query Returns: "+ noOfColumns);
HashMap<String, ArrayList<?>> matrixTable = getMatrixMetadata(resultSetMetaData);
System.out.println("MatrixTable: "+matrixTable);
ArrayList<String> dataTypeList = (ArrayList<String>) matrixTable.get("ColumnTypeName");
int rowCount = 0;
while (rs.next()) { // CSV Report
for (int columnIndex = 1; columnIndex <= noOfColumns; columnIndex++) {
// int id = rs.getInt("ID");
String value = getMatrixValue(rs, dataTypeList, columnIndex);
System.out.print(value);
if (columnIndex < noOfColumns) {
System.out.print(",");
}
}
System.out.println();
rowCount++;
}
System.out.println("Result FetchSize(Total Coloumns):"+rs.getFetchSize()+" = Rows*Coloums:["+rowCount+"*"+noOfColumns+"]");
}
}
static HashMap<String, ArrayList<?>> getMatrixMetadata(ResultSetMetaData meta) throws SQLException {
int columnsCount = meta.getColumnCount();
ArrayList<String> columnList = new ArrayList<String>();
ArrayList<String> dataTypeNameList = new ArrayList<String>();
ArrayList<Integer> dataTypeIdList = new ArrayList<Integer>();
HashMap<String, ArrayList<?>> returnHashMap = new HashMap<String, ArrayList<?>>();
for (int i = 1; i <= columnsCount; i++) {
columnList.add(meta.getColumnName(i));
dataTypeIdList.add(Integer.valueOf(meta.getColumnType(i)));
dataTypeNameList.add(meta.getColumnTypeName(i));
}
returnHashMap.put("ColumnName", columnList);
returnHashMap.put("ColumnTypeId", dataTypeIdList);
returnHashMap.put("ColumnTypeName", dataTypeNameList);
return returnHashMap;
}
static DecimalFormat DECIMAL_FORMAT = (DecimalFormat) NumberFormat.getInstance(Locale.ENGLISH);
static { // https://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html
DECIMAL_FORMAT.applyPattern("######.###"); // "#,#00.0#" → 1,234.56
}
public static String getMatrixValue(ResultSet rs, ArrayList<String> dataTypeNameList, int pos) throws SQLException {
String retval;
String columnTypeName = dataTypeNameList.get(pos - 1);
//int type = dataTypeIdList.get(pos - 1);
//if (type == Types.DECIMAL || type == Types.DOUBLE || type == Types.FLOAT || type == Types.NUMERIC || type == Types.REAL) {
if (columnTypeName.equalsIgnoreCase("NUMBER")) {
double doubleValue = rs.getDouble(pos);
if (rs.wasNull()) {
retval = null;
} else {
retval = "[N]"+DECIMAL_FORMAT.format(doubleValue);
}
} else if (columnTypeName.equalsIgnoreCase("DATE")) {
java.util.Date date = rs.getDate(pos);
if (rs.wasNull()) { // Checks last column read had a value of SQL NULL.
retval = null;
} else {
retval = "[D]"+formatDate(date, "dd.MM.yy");
}
} else if (columnTypeName.equalsIgnoreCase("TIMESTAMP")) {
java.sql.Timestamp timestamp = rs.getTimestamp(pos);
if (rs.wasNull()) {
retval = null;
} else {
java.util.Date date = new java.util.Date(timestamp.getTime());
retval = "[T]"+formatDate(date, "dd.MM.yyyy HH:mm");
}
} else { // VARCHAR2
retval = "[S]"+rs.getString(pos);
}
return retval;
}
public static String formatDate(Date aDate, String formatStr) {
DateFormat dateFormat = new SimpleDateFormat( formatStr );
//dateFormat.setCalendar(Calendar.getInstance(TimeZone.getTimeZone("IST")));
return dateFormat.format(aDate);
}
No of Cloumns Query Returns: 5
MatrixTable: {ColumnName=[ID, INSERTDATE, STRING_TIME, INSERTTIME, MSG], ColumnTypeId=[2, 93, 12, 93, 12], ColumnTypeName=[NUMBER, DATE, VARCHAR2, TIMESTAMP, VARCHAR2]}
[N]1,[D]30.12.20,[S]30.12.2020 00:40:50,[T]30.12.2020 00:40,[S]Insert1
[N]2,[D]30.12.20,[S]30.12.2020 13:40:50,[T]30.12.2020 13:40,[S]Insert2
Result FetchSize(Total Coloumns):10 = Rows*Coloums:[2*5]
涉及的 SQL 查询用于表创建和多记录插入:Oracle Multi insert
CREATE TABLE SCHEMA7.TEST_TABLE ( "ID" NUMBER, "INSERTDATE" DATE, "INSERTTIME" TIMESTAMP (6), "MSG" VARCHAR2(120 BYTE) );
INSERT INTO SCHEMA7.TEST_TABLE (ID, INSERTDATE, INSERTTIME, MSG) VALUES ('1', TO_DATE('30-DEC-2020', 'DD-MON-RR'), TO_TIMESTAMP('30-DEC-2020 12.40.50.00 AM', 'DD-MON-RR HH.MI.SS.FF AM'), 'Insert1');
INSERT INTO SCHEMA7.TEST_TABLE (ID, INSERTDATE, INSERTTIME, MSG) VALUES ('2', TO_DATE('30.12.2020', 'DD.MM.YYYY'), TO_TIMESTAMP('30.12.2020 13.40.50','dd.mm.yyyy hh24.mi.ss'), 'Insert2');