【问题标题】:Convert SQL string like "1:00 PM - 9:00 PM" into numerical hour columns将 SQL 字符串(如“1:00 PM - 9:00 PM”)转换为数字小时列
【发布时间】:2018-03-08 04:52:50
【问题描述】:

对于红移

我在名为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:00PM”变成“13:00”和“9:15PM”变成“21:15”的最佳方式是什么?

编辑:我还希望解决方案能够自动适应 AM 和 PM,而无需我手动指定哪个(希望有意义)。

提前致谢!

【问题讨论】:

  • 不是一个正式的答案,但是您有没有机会以更好的格式将您的日期/时间带入数据库?数据库不太适合这种类型的字符串操作工作。
  • 很遗憾,这手牌已经发了:/
  • 我建议使用您的应用程序代码将这些字符串转换为时间,然后按照数据库格式存储值,即 13 、 21:15 作为时间数据类型列

标签: sql amazon-redshift


【解决方案1】:

以下解决方案使用当前年份的 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;

Demo

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

【讨论】:

  • 啊,抱歉——应该指定这是 Redshift。没有数据类型time,最接近的是timestamp,并将类似“11:00 AM”的内容转换为timestamp表示输入语法无效
  • @SpicyClubSauce 我给了你一个使用TO_TIMESTAMP的选项。最新版 Redshift is supposed to support this。如果不是,那么您可能正在查看一个 非常 丑陋的查询,在这种情况下,您可能希望在将数据放入数据库之前对其进行清理。
  • 为什么要在YYYY-MM-DD部分加上?
  • 嗯...因为如果你不这样做,即使在 Postgres 上它也不会工作。您需要传入一个 timestamp 字符串(日期 + 时间),而不仅仅是时间。如果它在不这样做的情况下在 Redshift 上对您有用,那么当然可以使用它。
猜你喜欢
  • 2019-10-07
  • 2019-10-14
  • 2021-12-09
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 2021-03-06
相关资源
最近更新 更多