【问题标题】:getDateTime from ResultSet java从 ResultSet java 中获取日期时间
【发布时间】:2013-04-03 09:48:58
【问题描述】:

我有两列将 DateTime 值存储在 MySql 数据库中,

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

我应该使用getDate() 还是不行?

提前致谢

【问题讨论】:

    标签: java mysql datetime resultset


    【解决方案1】:

    使用getDate() 只会返回Date,因此,如果您希望同时使用日期和时间,请使用getTimestamp(String columnLabel) - 这应该可以,也可以将String columnLabel 替换为数据库中的实际列名。

    【讨论】:

    • getTimestamp Timestamp 但字段是 DateTime,这会引发编译错误
    • 时间戳 ts1 = rs.getTimestamp(String columnLabel);日期时间 dt1 = 新日期时间(ts1);如果你这样做,你可能不得不弄乱时区,所以检查你的时间。 DateTime dt1 = new DateTime(ts1,DateTimeZone.UTC);
    【解决方案2】:

    您可以使用ResultSet.getTimeStamp()

    【讨论】:

      【解决方案3】:

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

      首先,如果数据库中的日期时间要表示一个时间点,请使用 MySQL 中的 timestamp 数据类型,而不是 datetimedatetime 可以解释为读者或阅读它的程序碰巧使用的任何时区。这可能会导致难以调试的错误。 timestamp 数据类型在各种 RDBMS 中的行为不同。在 MySQL 中,它确保日期和时间采用 UTC,从而排除对任何其他时区的错误解释。它更安全。如果您所在时区的用户在数据库中读取日期和时间有点困难,那是值得的。

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

      使用ResultSet.getObject() 将数据库中的日期和时间检索为来自java.time(现代Java 日期和时间API)的类型。问题中提到或暗示的 java.sql.Timestampjava.sql.Datejava.util.Date 类以及其他答案都设计不佳且早已过时,因此我推荐使用现代 API。它需要符合 JDBC 4.2 的驱动程序。我们大多数人都有这种情况,其中一个人已经使用 MySQL 很多年了。所以我希望你没事。

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

      回答您的具体问题

      我应该使用getDate() 还是不行?

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

      链接

      【讨论】:

        【解决方案4】:

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

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

        将返回:

        2014-02-18

        数据库字段数据:“2014-02-18 00:00:00.000”

        【讨论】:

        • getDate() 不会给你time 部分。如果您想要mysql datetimetime 部分,这不是最好的。
        【解决方案5】:

        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');
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-21
          • 1970-01-01
          • 2014-03-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多