【问题标题】:Date Time string with AM/PM conversion to DateTime in Clickhouse在 Clickhouse 中将 AM/PM 转换为 DateTime 的日期时间字符串
【发布时间】:2021-04-01 21:43:25
【问题描述】:

我无法将带有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


【解决方案1】:

从 ClickHouse 版本 21.1.2.15 开始,此错误行为已得到修复。


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

parseDateTimeBestEffort.h

AM/PM - AM 被忽略,PM 表示:如果值小于 12,则增加 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 │
└────────────────────────┴─────────────────────┴─────────────────────┘

*/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-29
    • 2017-01-16
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多