在 Clickhouse 中 AM/PM 转换为 DateTime 的日期时间字符串

Date Time string with AM/PM conversion to DateTime in Clickhouse

我在将带有 DateTime 信息的字符串转换为 AM/PM 格式时遇到问题。
我在 12: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 开始得到修复。


不幸的是,这是当前实现的特殊性。让我们检查一下源代码:

parseDateTimeBestEffort.h

AM/PM - AM is ignored and PM means: add 12 hours if value is less than 12.

(参见 parseDateTimeBestEffort.cpp


我创建了错误 #18402 parseDateTimeBestEffort should not ignore AM abbreviation for 12th hour


作为解决方法,我建议这样:

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 │
└────────────────────────┴─────────────────────┴─────────────────────┘

*/