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 格式的字符串字段转换为秒和向后的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript 秒到时间字符串,格式为 hh:mm:ss
如何使用 NodeJS 将 UTC 日期格式化为 `YYYY-MM-DD hh:mm:ss` 字符串?
如何将给定的字符串格式解析为 dd-MMM-yyyy hh:mm:ss:aa?