适用于Redshift
我在名为workhours
的列中有“1:00 PM - 9:15 PM”之类的字符串。
在SQL中将此类字符串转换为两列(开始时间,结束时间)的最有效方法是什么,类似于:
start_time | end_time
13:00 21:15
我知道第一步是从:
开始select
split_part(workhours, '-', 1) as start_time,
split_part(workhours, '-', 2) as end_time
但是从这里开始,将“1:00 PM”变为“13:00”和“9:15 PM”变成“21:15”的最佳方式是什么?
编辑:我还希望该解决方案能够自动适应AM和PM,而无需我手动具体(希望有意义)。
提前致谢!
答案 0 :(得分:2)
以下解决方案使用当前年1月1日的虚拟时间戳以及最新Redshift应支持的TO_TIMESTAMP
函数构建虚拟时间戳。然后使用TO_CHAR
提取24小时时间部分。
SELECT
TO_CHAR(TO_TIMESTAMP('2018-01-01 ' || SPLIT_PART('1:00 PM - 9:15 PM', '-', 1),
'YYYY-MM-DD HH:MI PM'), 'HH24:MI:SS') AS part1,
TO_CHAR(TO_TIMESTAMP('2018-01-01 ' || SPLIT_PART('1:00 PM - 9:15 PM', '-', 2),
'YYYY-MM-DD HH:MI PM'), 'HH24:MI:SS') AS part2;
但我认为最好的长期解决方案是将日期信息存储为数据库中的日期类型。最有可能的是,有一些与这些时间相关的日期概念,并且存储时间本身可能不是在现实生活中经常出现的用例。