mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-10 17:44:23 +00:00
parent
fb3af065f4
commit
0d5d2a9b55
@ -1245,7 +1245,6 @@ Returns DateTime values parsed from input string according to a MySQL style form
|
||||
**Supported format specifiers**
|
||||
|
||||
All format specifiers listed in [formatDateTime](/docs/en/sql-reference/functions/date-time-functions.md#date_time_functions-formatDateTime) except:
|
||||
- %f: fractional second
|
||||
- %Q: Quarter (1-4)
|
||||
|
||||
**Example**
|
||||
|
@ -1035,6 +1035,36 @@ namespace
|
||||
return cur;
|
||||
}
|
||||
|
||||
static Pos mysqlMicrosecond(Pos cur, Pos end, const String & fragment, DateTime & /*date*/)
|
||||
{
|
||||
checkSpace(cur, end, 6, "mysqlMicrosecond requires size >= 6", fragment);
|
||||
|
||||
Pos start = cur;
|
||||
auto check_is_number = [&](Pos pos) {
|
||||
if (*pos < '0' || *pos > '9')
|
||||
throw Exception(
|
||||
ErrorCodes::CANNOT_PARSE_DATETIME,
|
||||
"Unable to parse fragment '{}' from '{}' because '{}'' is not a number ",
|
||||
fragment,
|
||||
std::string_view(start, end),
|
||||
*cur);
|
||||
};
|
||||
|
||||
check_is_number(cur);
|
||||
++cur;
|
||||
check_is_number(cur);
|
||||
++cur;
|
||||
check_is_number(cur);
|
||||
++cur;
|
||||
check_is_number(cur);
|
||||
++cur;
|
||||
check_is_number(cur);
|
||||
++cur;
|
||||
check_is_number(cur);
|
||||
++cur;
|
||||
return cur;
|
||||
}
|
||||
|
||||
static Pos mysqlISO8601Time(Pos cur, Pos end, const String & fragment, DateTime & date)
|
||||
{
|
||||
checkSpace(cur, end, 8, "mysqlISO8601Time requires size >= 8", fragment);
|
||||
@ -1446,6 +1476,10 @@ namespace
|
||||
instructions.emplace_back(ACTION_ARGS(Instruction::mysqlDayOfMonthSpacePadded));
|
||||
break;
|
||||
|
||||
// Fractional seconds
|
||||
case 'f':
|
||||
instructions.emplace_back(ACTION_ARGS(Instruction::mysqlMicrosecond));
|
||||
break;
|
||||
|
||||
// Short YYYY-MM-DD date, equivalent to %Y-%m-%d 2001-08-23
|
||||
case 'F':
|
||||
@ -1593,8 +1627,6 @@ namespace
|
||||
/// Unimplemented
|
||||
|
||||
/// Fractional seconds
|
||||
case 'f':
|
||||
throw Exception(ErrorCodes::NOT_IMPLEMENTED, "format is not supported for fractional seconds");
|
||||
case 'U':
|
||||
throw Exception(ErrorCodes::NOT_IMPLEMENTED, "format is not supported for WEEK (Sun-Sat)");
|
||||
case 'v':
|
||||
|
@ -190,6 +190,13 @@ select parseDateTime('00/', '%s/', 'UTC') = toDateTime('1970-01-01 00:00:00', 'U
|
||||
select parseDateTime('60', '%s', 'UTC'); -- { serverError CANNOT_PARSE_DATETIME }
|
||||
select parseDateTime('-1', '%s', 'UTC'); -- { serverError CANNOT_PARSE_DATETIME }
|
||||
select parseDateTime('123456789', '%s', 'UTC'); -- { serverError CANNOT_PARSE_DATETIME }
|
||||
-- microsecond
|
||||
select parseDateTime('000000', '%f', 'UTC') = toDateTime('1970-01-01 00:00:00', 'UTC');
|
||||
1
|
||||
select parseDateTime('456789', '%f', 'UTC') = toDateTime('1970-01-01 00:00:00', 'UTC');
|
||||
1
|
||||
select parseDateTime('42', '%f', 'UTC') = toDateTime('1970-01-01 00:00:00', 'UTC'); -- { serverError NOT_ENOUGH_SPACE }
|
||||
select parseDateTime('12ABCD', '%f', 'UTC') = toDateTime('1970-01-01 00:00:00', 'UTC'); -- { serverError CANNOT_PARSE_DATETIME }
|
||||
-- mixed YMD format
|
||||
select parseDateTime('2021-01-04+23:00:00', '%Y-%m-%d+%H:%i:%s', 'UTC') = toDateTime('2021-01-04 23:00:00', 'UTC');
|
||||
1
|
||||
|
@ -127,6 +127,13 @@ select parseDateTime('00/', '%s/', 'UTC') = toDateTime('1970-01-01 00:00:00', 'U
|
||||
select parseDateTime('60', '%s', 'UTC'); -- { serverError CANNOT_PARSE_DATETIME }
|
||||
select parseDateTime('-1', '%s', 'UTC'); -- { serverError CANNOT_PARSE_DATETIME }
|
||||
select parseDateTime('123456789', '%s', 'UTC'); -- { serverError CANNOT_PARSE_DATETIME }
|
||||
|
||||
-- microsecond
|
||||
select parseDateTime('000000', '%f', 'UTC') = toDateTime('1970-01-01 00:00:00', 'UTC');
|
||||
select parseDateTime('456789', '%f', 'UTC') = toDateTime('1970-01-01 00:00:00', 'UTC');
|
||||
select parseDateTime('42', '%f', 'UTC') = toDateTime('1970-01-01 00:00:00', 'UTC'); -- { serverError NOT_ENOUGH_SPACE }
|
||||
select parseDateTime('12ABCD', '%f', 'UTC') = toDateTime('1970-01-01 00:00:00', 'UTC'); -- { serverError CANNOT_PARSE_DATETIME }
|
||||
|
||||
-- mixed YMD format
|
||||
select parseDateTime('2021-01-04+23:00:00', '%Y-%m-%d+%H:%i:%s', 'UTC') = toDateTime('2021-01-04 23:00:00', 'UTC');
|
||||
select parseDateTime('2019-07-03 11:04:10', '%Y-%m-%d %H:%i:%s', 'UTC') = toDateTime('2019-07-03 11:04:10', 'UTC');
|
||||
|
Loading…
Reference in New Issue
Block a user