Sql 配置单元转换unix时间戳以进行计算

Sql 配置单元转换unix时间戳以进行计算,sql,hive,timestamp,hiveql,unix-timestamp,Sql,Hive,Timestamp,Hiveql,Unix Timestamp,我正在尝试在时间戳之间执行减法运算,并希望将时间戳转换为可以转换为分钟的形式 我使用regexp_replace将时间戳转换为以下形式: 2020-06-20T17:25:59:378Z 以下代码将其转换为秒 unix_timestamp(regexp_replace(value,'(.*?)T(.*?):([^:]*?)Z$','$1 $2\\.$3')) 我还有另外两个时间戳希望转换为秒,例如: 2020-03-19 15:45:33 03-19-2020 11:07:25:103

我正在尝试在时间戳之间执行减法运算,并希望将时间戳转换为可以转换为分钟的形式

我使用regexp_replace将时间戳转换为以下形式:

2020-06-20T17:25:59:378Z
以下代码将其转换为秒

unix_timestamp(regexp_replace(value,'(.*?)T(.*?):([^:]*?)Z$','$1 $2\\.$3'))  
我还有另外两个时间戳希望转换为秒,例如:

2020-03-19 15:45:33
03-19-2020 11:07:25:103
如何使用regexp_replace()或任何其他函数将这两个时间戳转换为秒


谢谢大家!

对于第一个,您确实不需要使用regex\u replace

select unix_timestamp('2020-06-20T17:25:59:378Z','yyyy-MM-dd'T'HH:mm:ss.SSSZ');
另外两个呢

select unix_timestamp('2020-03-19 15:45:33', 'yyyy-MM-dd HH:mm:ss');
select unix_timestamp('03-19-2020 11:07:25:103', 'MM-dd-yyyy HH:mm:ss:SSS');

首先,
unix\u timestamp
返回从unix时代经过的秒数。它确实忽略毫秒。这就是为什么如果希望纪元时间以秒为单位,则只能提取
'yyyy-MM-dd HH:MM:ss'

其次,如果在单个数据集中有所有这些不同的格式,并且希望将它们全部转换,则可以使用case语句检查模式并相应地进行转换:

with your_data as ( --This is your data example
select stack(3,
             '2020-06-20T17:25:59:378Z',
             '2020-03-19 15:45:33',
             '03-19-2020 11:07:25:103'
            ) as str
)

select case when str rlike '^(\\d{4}-\\d{2}-\\d{2})[T ](\\d{2}:\\d{2}:\\d{2})' --matches first two strings
             then unix_timestamp(regexp_replace(str,'^(\\d{4}-\\d{2}-\\d{2})[T ](\\d{2}:\\d{2}:\\d{2})','$1 $2'))
            when str rlike '^(\\d{2})-(\\d{2})-(\\d{4})[T ](\\d{2}:\\d{2}:\\d{2})' --matches third string, allows T or space after date
             then unix_timestamp(regexp_replace(str,'^(\\d{2})-(\\d{2})-(\\d{4})[T ](\\d{2}:\\d{2}:\\d{2})','$3-$1-$2 $4'))
        end result_unix_timestamp
from your_data
返回:

result_unix_timestamp
1592673959
1584632733
1584616045
您可以通过相应的转换向案例中添加更多模式,并以这种方式转换所有可能的案例。当然,并非所有情况下都应该使用regex_替换进行转换。尽管正则表达式允许识别和解析最复杂的字符串

您还可以尝试使用一种模式进行转换,如果它返回
null
,则尝试使用另一种模式进行转换,依此类推:

coalesce(unix_timestamp(regexp_replace(str,'^(\\d{4}-\\d{2}-\\d{2})[T ](\\d{2}:\\d{2}:\\d{2})','$1 $2')),
         unix_timestamp(regexp_replace(str,'^(\\d{2})-(\\d{2})-(\\d{4})[T ](\\d{2}:\\d{2}:\\d{2})','$3-$1-$2 $4'))
        )

我应用了代码,但结果都是空的……实际上,我只重试了2020-06-20T17:25:59:378Z不工作,其他的都工作了