MySqlデータベースにDateTime値を格納する2つの列があります。
Java=のResultSetから取得しようとすると、オプションがありません:getDateTime()
getDate()
を使用する必要がありますか、それとも機能しませんか?
前もって感謝します
getDate()
を使用するとDate
のみが返されるため、日付と時刻の両方が必要な場合はgetTimestamp(String columnLabel)
を使用します-これは機能するはずですが、String columnLabel
も次のように置き換えますデータベース内の実際の列名。
ResultSet.getTimeStamp() を使用できます
まず、データベースの日時が特定の時点を表す場合は、timestamp
ではなく、MySQLの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.timeの型に日付と時刻を取得します。最新のJava日付と時刻API。クラス_Java.sql.Timestamp
_、_Java.sql.Date
_および_Java.util.Date
_は、質問で言及または暗示され、他の回答はすべて設計が不十分で古くなっているため、代わりに最新のAPIをお勧めします。JDBC4.2準拠のドライバーが必要です。 MySQLには非常に長い年月が経っていますSO大丈夫だと思います。
MySQLでデータタイプを変更できない場合は、LocalDateTime
in Java for 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
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クエリは、テーブルの作成とマルチレコードの挿入用です。 Oracleマルチ挿入
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');