将“1:00 PM - 9:00 PM”之类的SQL字符串转换为数字小时列

时间:2018-03-08 04:52:50

标签: sql amazon-redshift

适用于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,而无需我手动具体(希望有意义)。

提前致谢!

1 个答案:

答案 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;

enter image description here

Demo

但我认为最好的长期解决方案是将日期信息存储为数据库中的日期类型。最有可能的是,有一些与这些时间相关的日期概念,并且存储时间本身可能不是在现实生活中经常出现的用例。