У меня возникли проблемы с преобразованием строк с информацией DateTime
в формате AM/PM.
Я получаю одинаковый результат для 00:10 и 12:10, хотя они должны быть разными.
Кроме 12:xx:xx AM работает нормально.
Я делаю что-то не так здесь?
select
parseDateTimeBestEffort('2020-01-01 12:10:00 AM'),
parseDateTimeBestEffort('2020-01-01 12:10:00 PM')
Результат:
2020-01-01 12:10:00
2020-01-01 12:10:00
Это неправильное поведение было исправлено, начиная с версии ClickHouse 21.1.2.15.
К сожалению, это специфика текущей реализации. Давайте проверим исходный код:
AM/PM — AM игнорируется, а PM означает: добавить 12 часов, если значение меньше 12.
(см. parseDateTimeBestEffort.cpp)
Я создал ошибку #18402 parseDateTimeBestEffort не должен игнорировать аббревиатуру AM для 12-го часа.
В качестве обходного пути я бы предложил такой способ:
SELECT
str,
parseDateTimeBestEffort(str) AS dt,
if ((toHour(dt) = 12) AND (str ILIKE '% am'), subtractHours(dt, 12), dt) AS fixed_dt
FROM
(
SELECT '2020-02-01 12:10:00 AM' AS str
UNION ALL
SELECT '2020-02-01 12:10:00 am'
UNION ALL
SELECT '2020-02-01 12:10:00 Am'
UNION ALL
SELECT '2020-02-01 12:10:00 aM'
UNION ALL
SELECT '2020-02-01 12:10:00 PM'
)
ORDER BY fixed_dt
/*
┌─str────────────────────┬──────────────────dt─┬────────────fixed_dt─┐
│ 2020-02-01 12:10:00 AM │ 2020-02-01 12:10:00 │ 2020-02-01 00:10:00 │
│ 2020-02-01 12:10:00 am │ 2020-02-01 12:10:00 │ 2020-02-01 00:10:00 │
│ 2020-02-01 12:10:00 Am │ 2020-02-01 12:10:00 │ 2020-02-01 00:10:00 │
│ 2020-02-01 12:10:00 aM │ 2020-02-01 12:10:00 │ 2020-02-01 00:10:00 │
│ 2020-02-01 12:10:00 PM │ 2020-02-01 12:10:00 │ 2020-02-01 12:10:00 │
└────────────────────────┴─────────────────────┴─────────────────────┘
*/
исправлено в версии 21.1.2.15.