Skip to content

Commit 8e29e4f

Browse files
committed
Adjust format of ResultSet#getString for DateTime
1 parent 1781ab7 commit 8e29e4f

File tree

3 files changed

+81
-22
lines changed

3 files changed

+81
-22
lines changed

client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/AbstractBinaryFormatReader.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -341,10 +341,16 @@ public static String readAsString(Object value, ClickHouseColumn column) {
341341
} else if (value instanceof ZonedDateTime) {
342342
ClickHouseDataType dataType = column.getDataType();
343343
ZonedDateTime zdt = (ZonedDateTime) value;
344-
if (dataType == ClickHouseDataType.Date) {
345-
return zdt.format(com.clickhouse.client.api.DataTypeUtils.DATE_FORMATTER);
344+
switch (dataType) { // should not be null
345+
case Date:
346+
case Date32:
347+
return zdt.format(DataTypeUtils.DATE_FORMATTER);
348+
case DateTime:
349+
case DateTime32:
350+
return zdt.format(DataTypeUtils.DATETIME_FORMATTER);
351+
default:
352+
return value.toString();
346353
}
347-
return value.toString();
348354
} else if (value instanceof BinaryStreamReader.EnumValue) {
349355
return ((BinaryStreamReader.EnumValue)value).name;
350356
} else if (value instanceof Number ) {

jdbc-v2/src/test/java/com/clickhouse/jdbc/DataTypeTests.java

Lines changed: 70 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.clickhouse.jdbc;
22

33
import com.clickhouse.client.api.ClientConfigProperties;
4+
import com.clickhouse.client.api.DataTypeUtils;
45
import com.clickhouse.client.api.internal.ServerSettings;
56
import com.clickhouse.data.ClickHouseVersion;
67
import com.clickhouse.data.Tuple;
@@ -26,6 +27,7 @@
2627
import java.sql.Statement;
2728
import java.sql.Timestamp;
2829
import java.text.DecimalFormat;
30+
import java.time.Instant;
2931
import java.time.LocalDate;
3032
import java.time.LocalDateTime;
3133
import java.time.OffsetDateTime;
@@ -207,8 +209,8 @@ public void testIntegerTypes() throws SQLException {
207209
assertTrue(rs.next());
208210
assertEquals(rs.getObject("int8"), (byte)int8);
209211
assertEquals(rs.getObject("int16"), (short)int16);
210-
assertEquals(rs.getObject("int32"), (int)int32);
211-
assertEquals(rs.getObject("int64"), (long)int64);
212+
assertEquals(rs.getObject("int32"), int32);
213+
assertEquals(rs.getObject("int64"), int64);
212214
assertEquals(rs.getObject("int128"), int128);
213215
assertEquals(rs.getObject("int256"), int256);
214216
assertEquals(rs.getObject("uint8"), uint8);
@@ -269,28 +271,28 @@ public void testUnsignedIntegerTypes() throws Exception {
269271

270272

271273
assertTrue(rs.next());
272-
assertEquals((Short) rs.getObject("uint8"), null);
273-
assertEquals((Integer) rs.getObject("uint16"), null);
274-
assertEquals((Long) rs.getObject("uint32"), null);
275-
assertEquals((BigInteger) rs.getObject("uint64"), null);
276-
assertEquals((BigInteger) rs.getObject("uint128"), null);
277-
assertEquals((BigInteger) rs.getObject("uint256"), null);
274+
assertEquals(rs.getObject("uint8"), null);
275+
assertEquals(rs.getObject("uint16"), null);
276+
assertEquals(rs.getObject("uint32"), null);
277+
assertEquals(rs.getObject("uint64"), null);
278+
assertEquals(rs.getObject("uint128"), null);
279+
assertEquals(rs.getObject("uint256"), null);
278280

279281
assertTrue(rs.next());
280282
assertEquals((Short) rs.getObject("uint8"), (byte) 0);
281283
assertEquals((Integer) rs.getObject("uint16"), (short) 0);
282284
assertEquals((Long) rs.getObject("uint32"), 0);
283-
assertEquals((BigInteger) rs.getObject("uint64"), BigInteger.ZERO);
284-
assertEquals((BigInteger) rs.getObject("uint128"), BigInteger.ZERO);
285-
assertEquals((BigInteger) rs.getObject("uint256"), BigInteger.ZERO);
285+
assertEquals(rs.getObject("uint64"), BigInteger.ZERO);
286+
assertEquals(rs.getObject("uint128"), BigInteger.ZERO);
287+
assertEquals(rs.getObject("uint256"), BigInteger.ZERO);
286288

287289
assertTrue(rs.next());
288290
assertEquals(((Short) rs.getObject("uint8")).intValue(), uint8);
289291
assertEquals((Integer) rs.getObject("uint16"), uint16);
290292
assertEquals((Long) rs.getObject("uint32"), uint32);
291-
assertEquals((BigInteger) rs.getObject("uint64"), BigInteger.valueOf(uint64));
292-
assertEquals((BigInteger) rs.getObject("uint128"), uint128);
293-
assertEquals((BigInteger) rs.getObject("uint256"), uint256);
293+
assertEquals(rs.getObject("uint64"), BigInteger.valueOf(uint64));
294+
assertEquals(rs.getObject("uint128"), uint128);
295+
assertEquals(rs.getObject("uint256"), uint256);
294296

295297
assertFalse(rs.next());
296298
}
@@ -317,11 +319,11 @@ public void testUUIDTypes() throws Exception {
317319
ResultSet rs = stmt.executeQuery("SELECT uuid FROM test_uuids ORDER BY order")) {
318320

319321
assertTrue(rs.next());
320-
assertNull((UUID) rs.getObject("uuid"));
322+
assertNull(rs.getObject("uuid"));
321323

322324

323325
assertTrue(rs.next());
324-
assertEquals((UUID) rs.getObject("uuid"), uuid);
326+
assertEquals(rs.getObject("uuid"), uuid);
325327

326328
assertFalse(rs.next());
327329
}
@@ -550,6 +552,57 @@ public void testDateTypes() throws SQLException {
550552
}
551553
}
552554
}
555+
556+
try (Connection conn = getJdbcConnection();
557+
Statement stmt = conn.createStatement();
558+
ResultSet rs = stmt.executeQuery("SELECT * FROM test_dates ORDER BY order"))
559+
{
560+
assertTrue(rs.next());
561+
assertEquals(rs.getString("date"), "1970-01-01");
562+
assertEquals(rs.getString("date32"), "1970-01-01");
563+
assertEquals(rs.getString("dateTime"), "1970-01-01 00:00:00");
564+
assertEquals(rs.getString("dateTime32"), "1970-01-01 00:00:00");
565+
assertEquals(rs.getString("dateTime643"), "1970-01-01T00:00Z[UTC]");
566+
assertEquals(rs.getString("dateTime646"), "1970-01-01T00:00Z[UTC]");
567+
assertEquals(rs.getString("dateTime649"), "1970-01-01T00:00Z[UTC]");
568+
569+
assertTrue(rs.next());
570+
assertEquals(rs.getString("date"), "2149-06-06");
571+
assertEquals(rs.getString("date32"), "2299-12-31");
572+
assertEquals(rs.getString("dateTime"), "2106-02-07 06:28:15");
573+
assertEquals(rs.getString("dateTime32"), "2106-02-07 06:28:15");
574+
assertEquals(rs.getString("dateTime643"), "2261-12-31T23:59:59.999Z[UTC]");
575+
assertEquals(rs.getString("dateTime646"), "2261-12-31T23:59:59.999999Z[UTC]");
576+
assertEquals(rs.getString("dateTime649"), "2261-12-31T23:59:59.999999999Z[UTC]");
577+
578+
ZoneId tzServer = ZoneId.of(((ConnectionImpl) conn).getClient().getServerTimeZone());
579+
assertTrue(rs.next());
580+
assertEquals(
581+
rs.getString("date"),
582+
Instant.ofEpochMilli(date.getTime()).atZone(tzServer).toLocalDate().toString());
583+
assertEquals(
584+
rs.getString("date32"),
585+
Instant.ofEpochMilli(date32.getTime()).atZone(tzServer).toLocalDate().toString());
586+
assertEquals(
587+
rs.getString("dateTime"),
588+
DataTypeUtils.DATETIME_FORMATTER.format(
589+
Instant.ofEpochMilli(dateTime.getTime()).atZone(tzServer)));
590+
assertEquals(
591+
rs.getString("dateTime32"),
592+
DataTypeUtils.DATETIME_FORMATTER.format(
593+
Instant.ofEpochMilli(dateTime32.getTime()).atZone(tzServer)));
594+
assertEquals(
595+
rs.getString("dateTime643"),
596+
dateTime643.toInstant().atZone(tzServer).toString());
597+
assertEquals(
598+
rs.getString("dateTime646"),
599+
dateTime646.toInstant().atZone(tzServer).toString());
600+
assertEquals(
601+
rs.getString("dateTime649"),
602+
dateTime649.toInstant().atZone(tzServer).toString());
603+
604+
assertFalse(rs.next());
605+
}
553606
}
554607

555608

@@ -1446,7 +1499,7 @@ public void testTypeConversions() throws Exception {
14461499
assertEquals(rs.getTimestamp(5).toString(), "2024-12-01 12:34:56.0");
14471500
assertTrue(rs.getObject(5) instanceof Timestamp);
14481501
assertEquals(rs.getObject(5), Timestamp.valueOf("2024-12-01 12:34:56"));
1449-
assertEquals(rs.getString(5), "2024-12-01T12:34:56Z[UTC]");
1502+
assertEquals(rs.getString(5), "2024-12-01 12:34:56");
14501503
assertEquals(rs.getObject(5, LocalDateTime.class), LocalDateTime.of(2024, 12, 1, 12, 34, 56));
14511504
assertEquals(rs.getObject(5, ZonedDateTime.class), ZonedDateTime.of(2024, 12, 1, 12, 34, 56, 0, ZoneId.of("UTC")));
14521505
assertEquals(String.valueOf(rs.getObject(5, new HashMap<String, Class<?>>(){{put(JDBCType.TIMESTAMP.getName(), LocalDateTime.class);}})), "2024-12-01T12:34:56");

jdbc-v2/src/test/java/com/clickhouse/jdbc/StatementTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,8 @@ public void testExecuteQueryDates() throws Exception {
136136
assertEquals(rs.getString("date"), "2020-01-01");
137137
assertEquals(rs.getDate(2).toString(), "2020-01-01");
138138
assertEquals(rs.getDate("datetime").toString(), "2020-01-01");
139-
assertEquals(rs.getString(2), "2020-01-01T10:11:12+03:00[Asia/Istanbul]");
140-
assertEquals(rs.getString("datetime"), "2020-01-01T10:11:12+03:00[Asia/Istanbul]");
139+
assertEquals(rs.getString(2), "2020-01-01 10:11:12");
140+
assertEquals(rs.getString("datetime"), "2020-01-01 10:11:12");
141141
assertFalse(rs.next());
142142
}
143143
}

0 commit comments

Comments
 (0)