在 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 开始得到修复。
不幸的是,这是当前实现的特殊性。让我们检查一下源代码:
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 │
└────────────────────────┴─────────────────────┴─────────────────────┘
*/
我在将带有 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 开始得到修复。
不幸的是,这是当前实现的特殊性。让我们检查一下源代码:
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 │
└────────────────────────┴─────────────────────┴─────────────────────┘
*/