简体   繁体   English

从结果集 java 中获取日期时间

[英]getDateTime from ResultSet java

I have two columns which store DateTime values in a MySql database,我有两列在 MySql 数据库中存储 DateTime 值,

When I try to get them from a ResultSet in Java there is no option: getDateTime()当我尝试从 Java 中的 ResultSet 获取它们时,没有选项: getDateTime()

Should I use getDate() or wouldn't that work?我应该使用getDate()还是不行?

Thanks in advance提前致谢

使用getDate()只返回一个Date ,所以在你的情况下,如果你想要日期和时间,请使用getTimestamp(String columnLabel) - 这应该有效,也可以用数据库中的实际列名替换String columnLabel

您可以使用ResultSet.getTimeStamp()

Prefer timestamp over datetime in MySQL在 MySQL 中,时间戳优于日期时间

First, if the datetime in your database is to represent a point in time, use the timestamp datatype in MySQL for that, not datetime .首先,如果数据库中的日期时间代表一个时间点,请使用 MySQL 中的timestamp数据类型,而不是datetime A datetime is open for interpretation into any time zone the reader or the program reading it happens to use. datetime时间可以解释为读者或阅读它的程序碰巧使用的任何时区。 This can lead to errors that are hard to debug.这可能会导致难以调试的错误。 The timestamp datatype behaves differently in various RDBMSs. timestamp数据类型在各种 RDBMS 中表现不同。 In MySQL it makes sure that dates and times are in UTC, thus excluding faulty interpretation into any other time zone.在 MySQL 中,它确保日期和时间采用 UTC,从而排除对任何其他时区的错误解释。 It's safer.这样更安全。 If the dates and times are a little harder for users in your own time zone to read in the database, it's worth it.如果您自己时区的用户在数据库中读取日期和时间有点困难,那么值得。

java.time时间

    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
        }
    }

Use ResultSet.getObject() for retrieving date and time from the database into a type from java.time, the modern Java date and time API.使用ResultSet.getObject()将日期和时间从数据库检索到 java.time 中的类型,现代 Java 日期和时间 API。 The classes java.sql.Timestamp , java.sql.Date and java.util.Date mentioned or implied in the question and the other answers are all poorly designed and long outdated, so I recommend the modern API instead.问题java.util.Date提到或暗示的java.sql.Timestampjava.sql.Datejava.util.Date类以及其他答案都设计得很差并且已经过时了,所以我推荐使用现代 API。 It requires a JDBC 4.2 compliant driver.它需要符合 JDBC 4.2 的驱动程序。 Most of us have that, and one has been out for MySQL for very many years.我们大多数人都有这种情况,而且 MySQL 已经有很多年了。 SO I expect that you are fine.所以我希望你没事。

If you cannot change the datatype in MySQL, use LocalDateTime in Java for retrieving values from your datatime column.如果你不能在MySQL中修改数据类型,使用LocalDateTime在Java中为您检索值datatime列。 It goes in the same way as in the code above.它的方式与上面的代码相同。

To answer your concrete question回答你的具体问题

Should I use getDate() or wouldn't that work?我应该使用getDate()还是不行?

No it would not.不,不会。 getDate() gives you a java.sql.Date holding only the date part from the database, the time of day part will be missing. getDate()给你一个java.sql.Date只包含数据库中的日期部分,一天中的时间部分将丢失。 As I said, java.sql.Date is also poorly designed — a true hack on top of the already poorly designed java.util.Date — so you shouldn't want that anyway.正如我所说, java.sql.Date设计也很糟糕——在已经设计得很糟糕的java.util.Date之上的一个真正的黑客——所以无论如何你都不应该想要它。

Links链接

Or with a typecast from date to string:或者使用从日期到字符串的类型转换:

resultSet.getDate(1).toString());

will return:将返回:

2014-02-18

DB field data: "2014-02-18 00:00:00.000" DB字段数据:“2014-02-18 00:00:00.000”

Converting java.sql.Timestamp to java.util.Date .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());

If you timestamp to date and convert it to java.sql.Timestamp then it results to DD:MM:YYYY 00:00:00 as the date will not cover time.如果您将时间戳记为日期并将其转换为java.sql.Timestamp则结果为DD:MM:YYYY 00:00:00因为日期不会涵盖时间。 So, it picks default as 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

Example to get records based on ResultSetMetaData for CSV Report:基于 CSV 报告的ResultSetMetaData获取记录的示例:

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 queries involved are for Table creation and multi record insertion: Oracle Multi insert涉及的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');

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM