未验证 提交 230f9b6a 编写于 作者: A alexey-milovidov 提交者: GitHub

Merge pull request #18449 from...

Merge pull request #18449 from vladimir-golovchenko/fix-AM-abbreviation-handling-for-parseDateTimeBestEffort

Bug fix '#18402 parseDateTimeBestEffort should not ignore AM abbreviation for 12th hour'
......@@ -119,6 +119,7 @@ ReturnType parseDateTimeBestEffortImpl(
UInt8 time_zone_offset_hour = 0;
UInt8 time_zone_offset_minute = 0;
bool is_am = false;
bool is_pm = false;
auto read_alpha_month = [&month] (const auto & alpha)
......@@ -486,6 +487,7 @@ ReturnType parseDateTimeBestEffortImpl(
{
if (alpha[0] == 'A' || alpha[0] == 'a')
{
is_am = true;
}
else if (alpha[0] == 'P' || alpha[0] == 'p')
{
......@@ -560,6 +562,9 @@ ReturnType parseDateTimeBestEffortImpl(
if (!check_date(is_leap_year, month, day_of_month))
return on_error("Cannot read DateTime: unexpected date: " + std::to_string(year) + "-" + std::to_string(month) + "-" + std::to_string(day_of_month), ErrorCodes::CANNOT_PARSE_DATETIME);
if (is_am && hour == 12)
hour = 0;
if (is_pm && hour < 12)
hour += 12;
......
......@@ -50,7 +50,7 @@ class ReadBuffer;
*
* single whitespace can be used as a separator
*
* AM/PM - AM is ignored and PM means: add 12 hours if value is less than 12.
* AM/PM - AM means: subtract 12 hours if a value is 12 and PM means: add 12 hours if a value is less than 12.
*
* Jan/Feb/Mar/Apr/May/Jun/Jul/Aug/Sep/Oct/Nov/Dec - allowed to specify month
* Mon/Tue/Wed/Thu/Fri/Sat/Sun - simply ignored.
......
......@@ -7,6 +7,10 @@
01/02/2017 03:04:05+300 2017-01-02 00:04:05
01.02.2017 03:04:05GMT 2017-01-02 03:04:05
01-02-2017 03:04:05 MSD 2017-01-01 23:04:05
01-02-2017 11:04:05 AM 2017-01-02 11:04:05
01-02-2017 11:04:05 PM 2017-01-02 23:04:05
01-02-2017 12:04:05 AM 2017-01-02 00:04:05
01-02-2017 12:04:05 PM 2017-01-02 12:04:05
01.02.17 03:04:05 MSD Feb 2017-02-01 23:04:05
01/02/2017 03:04:05 MSK 2017-01-02 00:04:05
12/13/2019 2019-12-13 00:00:00
......
......@@ -11,6 +11,10 @@ FROM
'01/02/2017 03:04:05+300',
'01.02.2017 03:04:05GMT',
'01-02-2017 03:04:05 MSD',
'01-02-2017 11:04:05 AM',
'01-02-2017 11:04:05 PM',
'01-02-2017 12:04:05 AM',
'01-02-2017 12:04:05 PM',
'01.02.17 03:04:05 MSD Feb',
'01/02/2017 03:04:05 MSK',
'12/13/2019',
......
......@@ -2,42 +2,72 @@
2020-01-01 00:00:00 DateTime 2020-01-01 00:02:00.11 DateTime64(2) 2020-01-01 00:03:00 DateTime(\'Europe/Moscow\') 2020-01-01 00:04:00.220 DateTime64(3, \'Europe/Moscow\') 2020-01-01 00:05:00 DateTime
2020-01-01 00:00:00 DateTime 2020-01-01 00:02:00.11 DateTime64(2) 2020-01-01 00:03:00 DateTime(\'Europe/Moscow\') 2020-01-01 00:04:00.220 DateTime64(3, \'Europe/Moscow\') 2020-01-01 00:05:00 DateTime
2020-01-01 00:00:00 DateTime
parseDateTimeBestEffort
2020-05-14 03:37:03.000 DateTime64(3, \'UTC\')
2020-05-14 03:37:03.000 DateTime64(3, \'UTC\')
2020-05-14 11:37:03.000 DateTime64(3, \'UTC\')
2020-05-14 23:37:03.000 DateTime64(3, \'UTC\')
2020-05-14 00:37:03.000 DateTime64(3, \'UTC\')
2020-05-14 12:37:03.000 DateTime64(3, \'UTC\')
2020-05-14 03:37:03.253 DateTime64(3, \'UTC\')
2020-05-14 03:37:03.253 DateTime64(3, \'UTC\')
2020-05-14 06:37:03.253 DateTime64(3, \'Europe/Minsk\')
2020-05-14 03:37:03.253 DateTime64(3, \'UTC\')
parseDateTimeBestEffortOrNull
\N Nullable(DateTime64(3))
2020-05-14 03:37:03.000 Nullable(DateTime64(3, \'UTC\'))
2020-05-14 03:37:03.000 Nullable(DateTime64(3, \'UTC\'))
2020-05-14 11:37:03.000 Nullable(DateTime64(3, \'UTC\'))
2020-05-14 23:37:03.000 Nullable(DateTime64(3, \'UTC\'))
2020-05-14 00:37:03.000 Nullable(DateTime64(3, \'UTC\'))
2020-05-14 12:37:03.000 Nullable(DateTime64(3, \'UTC\'))
2020-05-14 03:37:03.253 Nullable(DateTime64(3, \'UTC\'))
2020-05-14 03:37:03.253 Nullable(DateTime64(3, \'UTC\'))
2020-05-14 06:37:03.253 Nullable(DateTime64(3, \'Europe/Minsk\'))
2020-05-14 03:37:03.253 Nullable(DateTime64(3, \'UTC\'))
parseDateTimeBestEffortOrZero
1970-01-01 00:00:00.000 DateTime64(3, \'UTC\')
2020-05-14 03:37:03.000 DateTime64(3, \'UTC\')
2020-05-14 03:37:03.000 DateTime64(3, \'UTC\')
2020-05-14 11:37:03.000 DateTime64(3, \'UTC\')
2020-05-14 23:37:03.000 DateTime64(3, \'UTC\')
2020-05-14 00:37:03.000 DateTime64(3, \'UTC\')
2020-05-14 12:37:03.000 DateTime64(3, \'UTC\')
2020-05-14 03:37:03.253 DateTime64(3, \'UTC\')
2020-05-14 03:37:03.253 DateTime64(3, \'UTC\')
2020-05-14 06:37:03.253 DateTime64(3, \'Europe/Minsk\')
2020-05-14 03:37:03.253 DateTime64(3, \'UTC\')
parseDateTime32BestEffort
2020-05-14 03:37:03 DateTime(\'UTC\')
2020-05-14 03:37:03 DateTime(\'UTC\')
2020-05-14 11:37:03 DateTime(\'UTC\')
2020-05-14 23:37:03 DateTime(\'UTC\')
2020-05-14 00:37:03 DateTime(\'UTC\')
2020-05-14 12:37:03 DateTime(\'UTC\')
2020-05-14 03:37:03 DateTime(\'UTC\')
2020-05-14 03:37:03 DateTime(\'UTC\')
2020-05-14 06:37:03 DateTime(\'Europe/Minsk\')
2020-05-14 03:37:03 DateTime(\'UTC\')
parseDateTime32BestEffortOrNull
\N Nullable(DateTime)
2020-05-14 03:37:03 Nullable(DateTime(\'UTC\'))
2020-05-14 03:37:03 Nullable(DateTime(\'UTC\'))
2020-05-14 11:37:03 Nullable(DateTime(\'UTC\'))
2020-05-14 23:37:03 Nullable(DateTime(\'UTC\'))
2020-05-14 00:37:03 Nullable(DateTime(\'UTC\'))
2020-05-14 12:37:03 Nullable(DateTime(\'UTC\'))
2020-05-14 03:37:03 Nullable(DateTime(\'UTC\'))
2020-05-14 03:37:03 Nullable(DateTime(\'UTC\'))
2020-05-14 06:37:03 Nullable(DateTime(\'Europe/Minsk\'))
2020-05-14 03:37:03 Nullable(DateTime(\'UTC\'))
parseDateTime32BestEffortOrZero
1970-01-01 00:00:00 DateTime(\'UTC\')
2020-05-14 03:37:03 DateTime(\'UTC\')
2020-05-14 03:37:03 DateTime(\'UTC\')
2020-05-14 11:37:03 DateTime(\'UTC\')
2020-05-14 23:37:03 DateTime(\'UTC\')
2020-05-14 00:37:03 DateTime(\'UTC\')
2020-05-14 12:37:03 DateTime(\'UTC\')
2020-05-14 03:37:03 DateTime(\'UTC\')
2020-05-14 03:37:03 DateTime(\'UTC\')
2020-05-14 06:37:03 DateTime(\'Europe/Minsk\')
......
......@@ -12,50 +12,79 @@ SELECT CAST('2020-01-01 00:00:00', 'DateTime') AS a, toTypeName(a), CAST('2020-0
SELECT toDateTime32('2020-01-01 00:00:00') AS a, toTypeName(a);
SELECT 'parseDateTimeBestEffort';
SELECT parseDateTimeBestEffort('<Empty>', 3) AS a, toTypeName(a); -- {serverError 41}
SELECT parseDateTimeBestEffort('2020-05-14T03:37:03', 3, 'UTC') AS a, toTypeName(a);
SELECT parseDateTimeBestEffort('2020-05-14 03:37:03', 3, 'UTC') AS a, toTypeName(a);
SELECT parseDateTimeBestEffort('2020-05-14 11:37:03 AM', 3, 'UTC') AS a, toTypeName(a);
SELECT parseDateTimeBestEffort('2020-05-14 11:37:03 PM', 3, 'UTC') AS a, toTypeName(a);
SELECT parseDateTimeBestEffort('2020-05-14 12:37:03 AM', 3, 'UTC') AS a, toTypeName(a);
SELECT parseDateTimeBestEffort('2020-05-14 12:37:03 PM', 3, 'UTC') AS a, toTypeName(a);
SELECT parseDateTimeBestEffort('2020-05-14T03:37:03.253184', 3, 'UTC') AS a, toTypeName(a);
SELECT parseDateTimeBestEffort('2020-05-14T03:37:03.253184Z', 3, 'UTC') AS a, toTypeName(a);
SELECT parseDateTimeBestEffort('2020-05-14T03:37:03.253184Z', 3, 'Europe/Minsk') AS a, toTypeName(a);
SELECT parseDateTimeBestEffort(materialize('2020-05-14T03:37:03.253184Z'), 3, 'UTC') AS a, toTypeName(a);
SELECT 'parseDateTimeBestEffortOrNull';
SELECT parseDateTimeBestEffortOrNull('<Empty>', 3) AS a, toTypeName(a);
SELECT parseDateTimeBestEffortOrNull('2020-05-14T03:37:03', 3, 'UTC') AS a, toTypeName(a);
SELECT parseDateTimeBestEffortOrNull('2020-05-14 03:37:03', 3, 'UTC') AS a, toTypeName(a);
SELECT parseDateTimeBestEffortOrNull('2020-05-14 11:37:03 AM', 3, 'UTC') AS a, toTypeName(a);
SELECT parseDateTimeBestEffortOrNull('2020-05-14 11:37:03 PM', 3, 'UTC') AS a, toTypeName(a);
SELECT parseDateTimeBestEffortOrNull('2020-05-14 12:37:03 AM', 3, 'UTC') AS a, toTypeName(a);
SELECT parseDateTimeBestEffortOrNull('2020-05-14 12:37:03 PM', 3, 'UTC') AS a, toTypeName(a);
SELECT parseDateTimeBestEffortOrNull('2020-05-14T03:37:03.253184', 3, 'UTC') AS a, toTypeName(a);
SELECT parseDateTimeBestEffortOrNull('2020-05-14T03:37:03.253184Z', 3, 'UTC') AS a, toTypeName(a);
SELECT parseDateTimeBestEffortOrNull('2020-05-14T03:37:03.253184Z', 3, 'Europe/Minsk') AS a, toTypeName(a);
SELECT parseDateTimeBestEffortOrNull(materialize('2020-05-14T03:37:03.253184Z'), 3, 'UTC') AS a, toTypeName(a);
SELECT 'parseDateTimeBestEffortOrZero';
SELECT parseDateTimeBestEffortOrZero('<Empty>', 3, 'UTC') AS a, toTypeName(a);
SELECT parseDateTimeBestEffortOrZero('2020-05-14T03:37:03', 3, 'UTC') AS a, toTypeName(a);
SELECT parseDateTimeBestEffortOrZero('2020-05-14 03:37:03', 3, 'UTC') AS a, toTypeName(a);
SELECT parseDateTimeBestEffortOrZero('2020-05-14 11:37:03 AM', 3, 'UTC') AS a, toTypeName(a);
SELECT parseDateTimeBestEffortOrZero('2020-05-14 11:37:03 PM', 3, 'UTC') AS a, toTypeName(a);
SELECT parseDateTimeBestEffortOrZero('2020-05-14 12:37:03 AM', 3, 'UTC') AS a, toTypeName(a);
SELECT parseDateTimeBestEffortOrZero('2020-05-14 12:37:03 PM', 3, 'UTC') AS a, toTypeName(a);
SELECT parseDateTimeBestEffortOrZero('2020-05-14T03:37:03.253184', 3, 'UTC') AS a, toTypeName(a);
SELECT parseDateTimeBestEffortOrZero('2020-05-14T03:37:03.253184Z', 3, 'UTC') AS a, toTypeName(a);
SELECT parseDateTimeBestEffortOrZero('2020-05-14T03:37:03.253184Z', 3, 'Europe/Minsk') AS a, toTypeName(a);
SELECT parseDateTimeBestEffortOrZero(materialize('2020-05-14T03:37:03.253184Z'), 3, 'UTC') AS a, toTypeName(a);
SELECT 'parseDateTime32BestEffort';
SELECT parseDateTime32BestEffort('<Empty>') AS a, toTypeName(a); -- {serverError 41}
SELECT parseDateTime32BestEffort('2020-05-14T03:37:03', 'UTC') AS a, toTypeName(a);
SELECT parseDateTime32BestEffort('2020-05-14 03:37:03', 'UTC') AS a, toTypeName(a);
SELECT parseDateTime32BestEffort('2020-05-14 11:37:03 AM', 'UTC') AS a, toTypeName(a);
SELECT parseDateTime32BestEffort('2020-05-14 11:37:03 PM', 'UTC') AS a, toTypeName(a);
SELECT parseDateTime32BestEffort('2020-05-14 12:37:03 AM', 'UTC') AS a, toTypeName(a);
SELECT parseDateTime32BestEffort('2020-05-14 12:37:03 PM', 'UTC') AS a, toTypeName(a);
SELECT parseDateTime32BestEffort('2020-05-14T03:37:03.253184', 'UTC') AS a, toTypeName(a);
SELECT parseDateTime32BestEffort('2020-05-14T03:37:03.253184Z', 'UTC') AS a, toTypeName(a);
SELECT parseDateTime32BestEffort('2020-05-14T03:37:03.253184Z', 'Europe/Minsk') AS a, toTypeName(a);
SELECT parseDateTime32BestEffort(materialize('2020-05-14T03:37:03.253184Z'), 'UTC') AS a, toTypeName(a);
SELECT 'parseDateTime32BestEffortOrNull';
SELECT parseDateTime32BestEffortOrNull('<Empty>') AS a, toTypeName(a);
SELECT parseDateTime32BestEffortOrNull('2020-05-14T03:37:03', 'UTC') AS a, toTypeName(a);
SELECT parseDateTime32BestEffortOrNull('2020-05-14 03:37:03', 'UTC') AS a, toTypeName(a);
SELECT parseDateTime32BestEffortOrNull('2020-05-14 11:37:03 AM', 'UTC') AS a, toTypeName(a);
SELECT parseDateTime32BestEffortOrNull('2020-05-14 11:37:03 PM', 'UTC') AS a, toTypeName(a);
SELECT parseDateTime32BestEffortOrNull('2020-05-14 12:37:03 AM', 'UTC') AS a, toTypeName(a);
SELECT parseDateTime32BestEffortOrNull('2020-05-14 12:37:03 PM', 'UTC') AS a, toTypeName(a);
SELECT parseDateTime32BestEffortOrNull('2020-05-14T03:37:03.253184', 'UTC') AS a, toTypeName(a);
SELECT parseDateTime32BestEffortOrNull('2020-05-14T03:37:03.253184Z', 'UTC') AS a, toTypeName(a);
SELECT parseDateTime32BestEffortOrNull('2020-05-14T03:37:03.253184Z', 'Europe/Minsk') AS a, toTypeName(a);
SELECT parseDateTime32BestEffortOrNull(materialize('2020-05-14T03:37:03.253184Z'), 'UTC') AS a, toTypeName(a);
SELECT 'parseDateTime32BestEffortOrZero';
SELECT parseDateTime32BestEffortOrZero('<Empty>', 'UTC') AS a, toTypeName(a);
SELECT parseDateTime32BestEffortOrZero('2020-05-14T03:37:03', 'UTC') AS a, toTypeName(a);
SELECT parseDateTime32BestEffortOrZero('2020-05-14 03:37:03', 'UTC') AS a, toTypeName(a);
SELECT parseDateTime32BestEffortOrZero('2020-05-14 11:37:03 AM', 'UTC') AS a, toTypeName(a);
SELECT parseDateTime32BestEffortOrZero('2020-05-14 11:37:03 PM', 'UTC') AS a, toTypeName(a);
SELECT parseDateTime32BestEffortOrZero('2020-05-14 12:37:03 AM', 'UTC') AS a, toTypeName(a);
SELECT parseDateTime32BestEffortOrZero('2020-05-14 12:37:03 PM', 'UTC') AS a, toTypeName(a);
SELECT parseDateTime32BestEffortOrZero('2020-05-14T03:37:03.253184', 'UTC') AS a, toTypeName(a);
SELECT parseDateTime32BestEffortOrZero('2020-05-14T03:37:03.253184Z', 'UTC') AS a, toTypeName(a);
SELECT parseDateTime32BestEffortOrZero('2020-05-14T03:37:03.253184Z', 'Europe/Minsk') AS a, toTypeName(a);
......
2010-01-01 00:00:00
2010-01-01 01:01:01
2020-01-01 11:01:01
2020-01-01 23:01:01
2020-01-01 00:01:01
2020-01-01 12:01:01
2000-01-01 01:01:01
\N
\N
......
SELECT parseDateTimeBestEffortOrNull('2010-01-01');
SELECT parseDateTimeBestEffortOrNull('2010-01-01 01:01:01');
SELECT parseDateTimeBestEffortOrNull('2020-01-01 11:01:01 am');
SELECT parseDateTimeBestEffortOrNull('2020-01-01 11:01:01 pm');
SELECT parseDateTimeBestEffortOrNull('2020-01-01 12:01:01 am');
SELECT parseDateTimeBestEffortOrNull('2020-01-01 12:01:01 pm');
SELECT parseDateTimeBestEffortOrNull('01:01:01');
SELECT parseDateTimeBestEffortOrNull('20100');
SELECT parseDateTimeBestEffortOrNull('0100:0100:0000');
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册