Skip to content

Commit c52fadb

Browse files
[Enhancement]Enhance datetime format (backport #39986) (#40473)
Co-authored-by: leoyy0316 <[email protected]>
1 parent 1395a3c commit c52fadb

File tree

4 files changed

+82
-12
lines changed

4 files changed

+82
-12
lines changed

fe/fe-core/src/main/java/com/starrocks/common/util/DateUtils.java

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -89,19 +89,23 @@ public class DateUtils {
8989
private static final DateTimeFormatter STRICT_DATE_NO_SPLIT_FORMATTER =
9090
unixDatetimeStrictFormatter("%Y%m%e", true);
9191

92-
// isTwoDigit, withMs, withSplitT -> formatter
93-
private static final DateTimeFormatter[][][] DATETIME_FORMATTERS = new DateTimeFormatter[2][2][2];
92+
// isTwoDigit, withMs, withSplitT, withSec -> formatter
93+
private static final DateTimeFormatter[][][][] DATETIME_FORMATTERS = new DateTimeFormatter[2][2][2][2];
9494

9595
static {
96-
// isTwoDigit, withMs, withSplitT -> formatter
97-
DATETIME_FORMATTERS[0][0][0] = unixDatetimeStrictFormatter("%Y-%m-%e %H:%i:%s", false);
98-
DATETIME_FORMATTERS[0][0][1] = unixDatetimeStrictFormatter("%Y-%m-%eT%H:%i:%s", false);
99-
DATETIME_FORMATTERS[0][1][0] = unixDatetimeStrictFormatter("%Y-%m-%e %H:%i:%s.%f", false);
100-
DATETIME_FORMATTERS[0][1][1] = unixDatetimeStrictFormatter("%Y-%m-%eT%H:%i:%s.%f", false);
101-
DATETIME_FORMATTERS[1][0][0] = unixDatetimeStrictFormatter("%y-%m-%e %H:%i:%s", false);
102-
DATETIME_FORMATTERS[1][0][1] = unixDatetimeStrictFormatter("%y-%m-%eT%H:%i:%s", false);
103-
DATETIME_FORMATTERS[1][1][0] = unixDatetimeStrictFormatter("%y-%m-%e %H:%i:%s.%f", false);
104-
DATETIME_FORMATTERS[1][1][1] = unixDatetimeStrictFormatter("%y-%m-%eT%H:%i:%s.%f", false);
96+
// isTwoDigit, withMs, withSplitT, withSec -> formatter
97+
DATETIME_FORMATTERS[0][0][0][0] = unixDatetimeStrictFormatter("%Y-%m-%e %H:%i", false);
98+
DATETIME_FORMATTERS[0][0][0][1] = unixDatetimeStrictFormatter("%Y-%m-%e %H:%i:%s", false);
99+
DATETIME_FORMATTERS[0][0][1][0] = unixDatetimeStrictFormatter("%Y-%m-%eT%H:%i", false);
100+
DATETIME_FORMATTERS[0][0][1][1] = unixDatetimeStrictFormatter("%Y-%m-%eT%H:%i:%s", false);
101+
DATETIME_FORMATTERS[0][1][0][1] = unixDatetimeStrictFormatter("%Y-%m-%e %H:%i:%s.%f", false);
102+
DATETIME_FORMATTERS[0][1][1][1] = unixDatetimeStrictFormatter("%Y-%m-%eT%H:%i:%s.%f", false);
103+
DATETIME_FORMATTERS[1][0][0][0] = unixDatetimeStrictFormatter("%y-%m-%e %H:%i", false);
104+
DATETIME_FORMATTERS[1][0][0][1] = unixDatetimeStrictFormatter("%y-%m-%e %H:%i:%s", false);
105+
DATETIME_FORMATTERS[1][0][1][0] = unixDatetimeStrictFormatter("%y-%m-%eT%H:%i", false);
106+
DATETIME_FORMATTERS[1][0][1][1] = unixDatetimeStrictFormatter("%y-%m-%eT%H:%i:%s", false);
107+
DATETIME_FORMATTERS[1][1][0][1] = unixDatetimeStrictFormatter("%y-%m-%e %H:%i:%s.%f", false);
108+
DATETIME_FORMATTERS[1][1][1][1] = unixDatetimeStrictFormatter("%y-%m-%eT%H:%i:%s.%f", false);
105109
}
106110

107111
public static String formatDateTimeUnix(LocalDateTime dateTime) {
@@ -126,9 +130,10 @@ public static LocalDateTime parseStrictDateTime(String str) {
126130
if (str.contains(":")) {
127131
// datetime
128132
int isTwoDigit = str.split("-")[0].length() == 2 ? 1 : 0;
133+
int withSec = str.split(":").length > 2 ? 1 : 0;
129134
int withMs = str.contains(".") ? 1 : 0;
130135
int withSplitT = str.contains("T") ? 1 : 0;
131-
DateTimeFormatter formatter = DATETIME_FORMATTERS[isTwoDigit][withMs][withSplitT];
136+
DateTimeFormatter formatter = DATETIME_FORMATTERS[isTwoDigit][withMs][withSplitT][withSec];
132137
return parseStringWithDefaultHSM(str, formatter);
133138
} else {
134139
// date

fe/fe-core/src/test/java/com/starrocks/common/util/DateUtilsTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,20 @@ public void testParseDatTimeString() {
6767
long ts = Utils.getLongFromDateTime(lt2);
6868
Assert.assertEquals(ts, 1682600771);
6969
}
70+
71+
{
72+
String datetime1 = "2024-01-27T21:06";
73+
LocalDateTime lt1 = DateUtils.parseStrictDateTime(datetime1);
74+
Assert.assertEquals(lt1.toString(), "2024-01-27T21:06");
75+
String datetime2 = "2024-01-27T21:06:00";
76+
LocalDateTime lt2 = DateUtils.parseStrictDateTime(datetime2);
77+
Assert.assertEquals(lt2.toString(), "2024-01-27T21:06");
78+
Assert.assertEquals(Utils.getLongFromDateTime(lt1), Utils.getLongFromDateTime(lt2));
79+
String datetime3 = "2024-01-27 21:06:01";
80+
LocalDateTime lt3 = DateUtils.parseStrictDateTime(datetime3);
81+
Assert.assertEquals(lt3.toString(), "2024-01-27T21:06:01");
82+
}
83+
7084
} catch (Exception e) {
7185
Assert.fail();
7286
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
-- name: test_iceberg_catalog_timestamp_type
2+
create external catalog ice_cat_${uuid0}
3+
properties
4+
(
5+
"type" = "iceberg",
6+
"iceberg.catalog.type" = "hive",
7+
"hive.metastore.uris" = "${iceberg_catalog_hive_metastore_uris}"
8+
);
9+
set catalog ice_cat_${uuid0};
10+
create database ice_db_${uuid0};
11+
use ice_db_${uuid0};
12+
create table ice_tbl_${uuid0} (
13+
col_str int,
14+
col_int datetime
15+
);
16+
insert into ice_tbl_${uuid0} values (1, '2024-01-29 01:00:00'),(2, '2024-01-30 20:10:00'),(3,null);
17+
-- result:
18+
-- !result
19+
select * from ice_cat_${uuid0}.ice_db_${uuid0}.ice_tbl_${uuid0};
20+
-- result:
21+
1 2024-01-29 01:00:00
22+
2 2024-01-30 20:10:00
23+
3 None
24+
-- !result
25+
drop table ice_tbl_${uuid0} force;
26+
drop database ice_db_${uuid0};
27+
drop catalog ice_cat_${uuid0};
28+
-- result:
29+
-- !result
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
-- name: test_iceberg_catalog_timestamp_type
2+
create external catalog ice_cat_${uuid0}
3+
properties
4+
(
5+
"type" = "iceberg",
6+
"iceberg.catalog.type" = "hive",
7+
"hive.metastore.uris" = "${iceberg_catalog_hive_metastore_uris}"
8+
);
9+
set catalog ice_cat_${uuid0};
10+
create database ice_db_${uuid0};
11+
use ice_db_${uuid0};
12+
create table ice_tbl_${uuid0} (
13+
col_str int,
14+
col_int datetime
15+
);
16+
insert into ice_tbl_${uuid0} values (1, '2024-01-29 01:00:00'),(2, '2024-01-30 20:10:00'),(3,null);
17+
18+
select * from ice_cat_${uuid0}.ice_db_${uuid0}.ice_tbl_${uuid0};
19+
20+
drop table ice_tbl_${uuid0} force;
21+
drop database ice_db_${uuid0};
22+
drop catalog ice_cat_${uuid0};

0 commit comments

Comments
 (0)