有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

来自ResultSet java的mysql getDateTime

我有两列在MySql数据库中存储日期时间值

当我尝试从Java中的ResultSet获取它们时,没有选项: getDateTime()

我应该使用getDate()还是不可以

提前谢谢


共 (5) 个答案

  1. # 2 楼答案

    Converting java.sql.Timestamp to 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
    

    基于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');
    
  2. # 3 楼答案

    在MySQL中更喜欢时间戳而不是日期时间

    首先,如果数据库中的datetime要表示时间点,请使用MySQL中的timestamp数据类型,而不是datetime。一个datetime是开放的,可以解释为读取器或它碰巧使用的程序读取的任何时区。这可能导致难以调试的错误。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中的类型。时间,现代Java日期和时间API。问题中提到或暗示的类java.sql.Timestampjava.sql.Datejava.util.Date以及其他答案都设计得很差,而且早已过时,因此我建议改用现代API。它需要一个兼容JDBC4.2的驱动程序。我们大多数人都有这种能力,其中一个已经为MySQL服务很多年了。所以我希望你没事

    如果无法更改MySQL中的数据类型,请使用Java中的LocalDateTimedatatime列检索值。它的运行方式与上面的代码相同

    回答你的具体问题

    Should I use getDate() or wouldn't that work?

    不,不会的getDate()给你一个java.sql.Date只保存数据库中的日期部分,时间部分将丢失。正如我所说的,java.sql.Date的设计也很糟糕-这是在已经设计糟糕的java.util.Date之上的一个真正的黑客-所以你无论如何都不应该想要它

    链接

  3. # 4 楼答案

    使用getDate()只会返回一个Date,因此在您的情况下,如果希望同时使用getTimestamp(String columnLabel)-这应该有效,还可以用数据库中的实际列名替换String columnLabel

  4. # 5 楼答案

    或使用从日期到字符串的类型转换:

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

    将返回:

    2014-02-18

    DB现场数据:“2014-02-18 00:00:00.000”