Skip to content

Commit 390058f

Browse files
leoyy0316mergify[bot]
authored andcommitted
[Enhancement]Enhance datetime format (#39986)
Signed-off-by: leoyy0316 <[email protected]> (cherry picked from commit 20e682c)
1 parent a5ad386 commit 390058f

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
@@ -72,19 +72,23 @@ public class DateUtils {
7272
private static final DateTimeFormatter STRICT_DATE_NO_SPLIT_FORMATTER =
7373
unixDatetimeStrictFormatter("%Y%m%e", true);
7474

75-
// isTwoDigit, withMs, withSplitT -> formatter
76-
private static final DateTimeFormatter[][][] DATETIME_FORMATTERS = new DateTimeFormatter[2][2][2];
75+
// isTwoDigit, withMs, withSplitT, withSec -> formatter
76+
private static final DateTimeFormatter[][][][] DATETIME_FORMATTERS = new DateTimeFormatter[2][2][2][2];
7777

7878
static {
79-
// isTwoDigit, withMs, withSplitT -> formatter
80-
DATETIME_FORMATTERS[0][0][0] = unixDatetimeStrictFormatter("%Y-%m-%e %H:%i:%s", false);
81-
DATETIME_FORMATTERS[0][0][1] = unixDatetimeStrictFormatter("%Y-%m-%eT%H:%i:%s", false);
82-
DATETIME_FORMATTERS[0][1][0] = unixDatetimeStrictFormatter("%Y-%m-%e %H:%i:%s.%f", false);
83-
DATETIME_FORMATTERS[0][1][1] = unixDatetimeStrictFormatter("%Y-%m-%eT%H:%i:%s.%f", false);
84-
DATETIME_FORMATTERS[1][0][0] = unixDatetimeStrictFormatter("%y-%m-%e %H:%i:%s", false);
85-
DATETIME_FORMATTERS[1][0][1] = unixDatetimeStrictFormatter("%y-%m-%eT%H:%i:%s", false);
86-
DATETIME_FORMATTERS[1][1][0] = unixDatetimeStrictFormatter("%y-%m-%e %H:%i:%s.%f", false);
87-
DATETIME_FORMATTERS[1][1][1] = unixDatetimeStrictFormatter("%y-%m-%eT%H:%i:%s.%f", false);
79+
// isTwoDigit, withMs, withSplitT, withSec -> formatter
80+
DATETIME_FORMATTERS[0][0][0][0] = unixDatetimeStrictFormatter("%Y-%m-%e %H:%i", false);
81+
DATETIME_FORMATTERS[0][0][0][1] = unixDatetimeStrictFormatter("%Y-%m-%e %H:%i:%s", false);
82+
DATETIME_FORMATTERS[0][0][1][0] = unixDatetimeStrictFormatter("%Y-%m-%eT%H:%i", false);
83+
DATETIME_FORMATTERS[0][0][1][1] = unixDatetimeStrictFormatter("%Y-%m-%eT%H:%i:%s", false);
84+
DATETIME_FORMATTERS[0][1][0][1] = unixDatetimeStrictFormatter("%Y-%m-%e %H:%i:%s.%f", false);
85+
DATETIME_FORMATTERS[0][1][1][1] = unixDatetimeStrictFormatter("%Y-%m-%eT%H:%i:%s.%f", false);
86+
DATETIME_FORMATTERS[1][0][0][0] = unixDatetimeStrictFormatter("%y-%m-%e %H:%i", false);
87+
DATETIME_FORMATTERS[1][0][0][1] = unixDatetimeStrictFormatter("%y-%m-%e %H:%i:%s", false);
88+
DATETIME_FORMATTERS[1][0][1][0] = unixDatetimeStrictFormatter("%y-%m-%eT%H:%i", false);
89+
DATETIME_FORMATTERS[1][0][1][1] = unixDatetimeStrictFormatter("%y-%m-%eT%H:%i:%s", false);
90+
DATETIME_FORMATTERS[1][1][0][1] = unixDatetimeStrictFormatter("%y-%m-%e %H:%i:%s.%f", false);
91+
DATETIME_FORMATTERS[1][1][1][1] = unixDatetimeStrictFormatter("%y-%m-%eT%H:%i:%s.%f", false);
8892
}
8993

9094
public static LocalDateTime parseStrictDateTime(String str) {
@@ -94,9 +98,10 @@ public static LocalDateTime parseStrictDateTime(String str) {
9498
if (str.contains(":")) {
9599
// datetime
96100
int isTwoDigit = str.split("-")[0].length() == 2 ? 1 : 0;
101+
int withSec = str.split(":").length > 2 ? 1 : 0;
97102
int withMs = str.contains(".") ? 1 : 0;
98103
int withSplitT = str.contains("T") ? 1 : 0;
99-
DateTimeFormatter formatter = DATETIME_FORMATTERS[isTwoDigit][withMs][withSplitT];
104+
DateTimeFormatter formatter = DATETIME_FORMATTERS[isTwoDigit][withMs][withSplitT][withSec];
100105
return parseStringWithDefaultHSM(str, formatter);
101106
} else {
102107
// 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)