Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 32 additions & 3 deletions be/src/runtime/datetime_value.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1073,6 +1073,8 @@ static int check_word(const char* lib[], const char* str, const char* end, const
return pos;
}

// this method is exaclty same as fromDateFormatStr() in DateLiteral.java in FE
// change this method should also change that.
bool DateTimeValue::from_date_format_str(
const char* format, int format_len,
const char* value, int value_len,
Expand Down Expand Up @@ -1315,14 +1317,14 @@ bool DateTimeValue::from_date_format_str(
date_part_used = true;
break;
case 'r':
if (from_date_format_str("%I:%i:%S %p", 11, val, val_end - val, &tmp)) {
if (!from_date_format_str("%I:%i:%S %p", 11, val, val_end - val, &tmp)) {
return false;
}
val = tmp;
time_part_used = true;
break;
case 'T':
if (from_date_format_str("%H:%i:%S", 8, val, val_end - val, &tmp)) {
if (!from_date_format_str("%H:%i:%S", 8, val, val_end - val, &tmp)) {
return false;
}
time_part_used = true;
Expand Down Expand Up @@ -1363,6 +1365,33 @@ bool DateTimeValue::from_date_format_str(
}
}

// continue to iterate pattern if has
// to find out if it has time part.
while (ptr < end) {
if (*ptr == '%' && ptr + 1 < end) {
ptr++;
switch (*ptr++) {
case 'H':
case 'h':
case 'I':
case 'i':
case 'k':
case 'l':
case 'r':
case 's':
case 'S':
case 'p':
case 'T':
time_part_used = true;
break;
default:
break;
}
} else {
ptr++;
}
}

if (usa_time) {
if (_hour > 12 || _hour < 1) {
return false;
Expand All @@ -1371,7 +1400,7 @@ bool DateTimeValue::from_date_format_str(
}
if (sub_val_end) {
*sub_val_end = val;
return 0;
return true;
}
// Year day
if (yearday > 0) {
Expand Down
2 changes: 1 addition & 1 deletion be/test/runtime/datetime_value_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -521,7 +521,7 @@ TEST_F(DateTimeValueTest, from_date_format_str) {
value.to_string(str);
ASSERT_STREQ("2015-01-05 12:34:56", str);

// hour
// hour
format_str = "%Y-%m-%d %H %i %s";
value_str = "88-2-1 03 4 5";
ASSERT_TRUE(value.from_date_format_str(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,14 @@ mysql> select str_to_date('200442 Monday', '%X%V %W');
+-----------------------------------------+
| 2004-10-18 |
+-----------------------------------------+

mysql> select str_to_date("2020-09-01", "%Y-%m-%d %H:%i:%s");
+------------------------------------------------+
| str_to_date('2020-09-01', '%Y-%m-%d %H:%i:%s') |
+------------------------------------------------+
| 2020-09-01 00:00:00 |
+------------------------------------------------+
1 row in set (0.01 sec)
```
## keyword

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ under the License.

`DATETIME STR_TO_DATE(VARCHAR str, VARCHAR format)`


通过format指定的方式将str转化为DATE类型,如果转化结果不对返回NULL

支持的format格式与date_format一致
Expand Down Expand Up @@ -58,6 +57,14 @@ mysql> select str_to_date('200442 Monday', '%X%V %W');
+-----------------------------------------+
| 2004-10-18 |
+-----------------------------------------+

mysql> select str_to_date("2020-09-01", "%Y-%m-%d %H:%i:%s");
+------------------------------------------------+
| str_to_date('2020-09-01', '%Y-%m-%d %H:%i:%s') |
+------------------------------------------------+
| 2020-09-01 00:00:00 |
+------------------------------------------------+
1 row in set (0.01 sec)
```

## keyword
Expand Down
Loading