我想将“1 天 07:00:00”和“2 天”等混合格式的列转换为小时。
以下是应在 Amazon Redshift 中运行的查询:
SELECT
CASE
WHEN POSITION('day', estimated_time_to_pickup) > 0 THEN
24 * CAST(SPLIT_PART(estimated_time_to_pickup, ' ', 1) AS INTEGER) +
EXTRACT(HOUR FROM TO_TIMESTAMP(SUBSTRING(estimated_time_to_pickup, POSITION('day', estimated_time_to_pickup) + 3), 'HH24:MI:SS'))
ELSE
24 * CAST(TRIM(' days' FROM estimated_time_to_pickup)::INTEGER)
END AS estimated_time_in_hours
FROM
"dev"."staging"."stg_zidship__service_levels_servicelevel"
LIMIT 100;
您可以使用
CASE WHEN
子句以及正则表达式来提取相关信息。这是一个示例查询:
SELECT
your_column_with_days,
CASE
WHEN your_column_with_days ~ '^\d+ day[s]?$' THEN
CAST(SUBSTRING(your_column_with_days FROM '(\d+) day[s]?$') AS INTEGER) * 24
WHEN your_column_with_days ~ '^\d+ day[s]? (\d{2}):(\d{2}):(\d{2})$' THEN
CAST(SUBSTRING(your_column_with_days FROM '(\d+) day[s]? (\d{2}):(\d{2}):(\d{2})$') AS INTEGER) * 24
+ CAST(EXTRACT(HOUR FROM INTERVAL '00:' || SUBSTRING(your_column_with_days FROM '(\d+) day[s]? (\d{2}):(\d{2}):(\d{2})$') || ' hours') AS INTEGER)
ELSE
NULL -- Handle other cases as needed
END AS hours
FROM
your_table;
将
your_column_with_days
替换为表中存储时间(以天为单位)的列的实际名称,并将 your_table
替换为表的实际名称。
此查询使用正则表达式检查两种模式。第一个模式适用于“2 天”等情况,第二个模式适用于“1 天 07:00:00”等情况。然后,
CASE WHEN
子句根据匹配的模式计算相应的小时数。