我想将字符串日期数组转换为两个单独的日期时间列。
该数组始终至少有一个字符串日期,有时会有两个字符串日期。不会有3+
提取并解析第一个字符串很容易。
但第二个有时不存在,所以我需要逻辑来处理它不存在的情况。
不幸的是,我的以下尝试出现错误。该错误向我表明,无论 myArray[2] 是否实际存在,parseDateTime 函数都正在运行,我希望 if 子句能够阻止这种情况。请注意,dateTo 和 dateToAlternative 查询行都会给出相同的错误。
with base as (
select ['2024-05-08 15:10:49'] as myArray
)
select parseDateTime(myArray[1], '%Y-%m-%d %H:%i:%s') as dateFrom
, case when length(myArray) > 1 then parseDateTime(myArray[2], '%Y-%m-%d %H:%i:%s') else null end as dateTo
, if(length(myArray) > 1, parseDateTime(myArray[2], '%Y-%m-%d %H:%i:%s'), null) as dateToAlternative
from base
如果 myArray 只有一项,我希望 if 子句返回 null。
您至少有一个包含两个日期的数组吗?如果是这样,那应该可以工作(为了方便起见,我将您的查询更改为使用 CASE WHEN ,您的查询也应该可以工作):
with base as (
select ['2024-05-08 15:10:49'], ['2024-05-08 15:10:49','2024-05-08 15:10:49'] as myArray
)
SELECT
parseDateTime(myArray[1], '%Y-%m-%d %H:%i:%s') AS dateFrom,
CASE WHEN length(myArray) > 1 THEN parseDateTime(myArray[1], '%Y-%m-%d %H:%i:%s') ELSE NULL END AS dateTo
FROM base
这对我有用:
with base as (
select arrayMap(x -> parseDateTime(x, '%Y-%m-%d %H:%i:%s'), ['2024-05-08 15:10:49']) as myDateArray
)
select myDateArray[1] as dateFrom
, case when myDateArray[2] = '1970-01-01 00:00:00' then null else myDateArray[2] end as dateTo
from base