Redshift:将 HH:MM:SS 格式的字符串字段转换为秒和向后

Posted

技术标签:

【中文标题】Redshift:将 HH:MM:SS 格式的字符串字段转换为秒和向后【英文标题】:Redshift: Conversion of string field in HH:MM:SS format to seconds and backwards 【发布时间】:2018-12-29 11:57:33 【问题描述】:

    我一直在寻找一种简单的方法来将字符串字段从 HH:MM:SS 格式转换为 Redshift 中的秒数,因为 TIME_TO_SEC 函数不存在。

    我有一个呼叫中心数据库,其中包含这种格式的字符串字段,HH:MM:SS。例如,如果它是00:05:10,那么我需要将其转换为310。我自己想出了以下方法,但必须有更好的方法:

    (SPLIT_PART("HANDLE TIME", ':', 1) * 3600) + 
    (SPLIT_PART(SPLIT_PART("HANDLE TIME", ':', 2),':', 1) * 60) + 
     CAST(SPLIT_PART("HANDLE TIME", ':', 3) AS INT)
    

    一旦我总结了秒数,我需要将秒数转换回HH:MM:SS 格式。所以1249 会变成字符串00:20:49。在 mysql 中如此简单,在 RedShift 中则不然。

任何帮助将不胜感激。

【问题讨论】:

您能告诉我们您计划对秒数和时间戳做什么吗? 在 Postgres 中你可以这样做:extract(epoch from '00:05:10'::time) 不知道 Redshift 是否也支持 【参考方案1】:

很遗憾,我手头没有 Redshift,但您可以执行以下操作:

select datediff(second,
                timestamp('2000-01-01'),
                timestamp('2000-01-01 ' || handle_time)
               )

【讨论】:

【参考方案2】:

Redshift 没有专门用于此的功能。但是,它有一个很棒的功能,叫做UDF,它支持python,因此它非常适合。

1.要将秒转换为 hh:mm:ss(或天,hh:mm:ss),请在 redshift 中创建此 UDF -

CREATE FUNCTION to_hhmmss (a bigint)
RETURNS character varying
STABLE
AS $$
  import datetime
  return str(datetime.timedelta(seconds=a))
$$ LANGUAGE plpythonu;

它接受一个“大整数”(秒)值作为参数并返回一个字符串(时间,hh:mm:ss 格式)

示例输出 -

db=# select to_hhmmss_1(12004);
 to_hhmmss_1
-------------
 3:20:04
(1 row)

db=# select to_hhmmss_1(120040);
  to_hhmmss_1
----------------
 1 day, 9:20:40
(1 row)

2.将 hh:mm:ss 转换为秒 -

CREATE FUNCTION to_seconds (time_str varchar(20))
RETURNS integer
STABLE
AS $$
  h, m, s = time_str.split(':')
  return int(h) * 3600 + int(m) * 60 + int(s)
$$ LANGUAGE plpythonu;

此函数将接受一个字符串(时间单位为 hh:mm:ss)并返回一个整数(秒)。 示例输出 -

db=# select to_seconds('1:00:00');
 to_seconds
------------
       3600
(1 row)

【讨论】:

以上是关于Redshift:将 HH:MM:SS 格式的字符串字段转换为秒和向后的主要内容,如果未能解决你的问题,请参考以下文章

hh:mm:ss时间格式那些事儿

JavaScript 秒到时间字符串,格式为 hh:mm:ss

如何使用 NodeJS 将 UTC 日期格式化为 `YYYY-MM-DD hh:mm:ss` 字符串?

如何将给定的字符串格式解析为 dd-MMM-yyyy hh:mm:ss:aa?

格式为“yyyy-mm-dd HH:mm:ss”的 Java 字符串到日期对象

将这种“ yyyy-MM-dd'T'HH:mm:ss.SSSXXX”格式的字符串转换为LocalDate