HIVE 转换 unix 时间戳以进行计算
HIVE converting unix timestamp for calculation
我正在尝试在时间戳之间执行减法,并希望将时间戳转换为可以转换为分钟的形式。
我使用 regexp_replace 将时间戳转换成这样的形式:
2020-06-20T17:25:59:378Z
下面的代码会将其转换为秒
unix_timestamp(regexp_replace(value,'(.*?)T(.*?):([^:]*?)Z$',' \.'))
我还有另外两个时间戳要转换成秒,例如:
2020-03-19 15:45:33
03-19-2020 11:07:25:103
我应该如何使用 regexp_replace() 或任何其他函数将这两个时间戳转换为秒?
谢谢!
对于第一个你真的不需要使用regex_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_timestamp
returns 秒从 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})',' '))
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})','-- '))
end result_unix_timestamp
from your_data
Returns:
result_unix_timestamp
1592673959
1584632733
1584616045
您可以在案例中添加更多的模式并进行相应的转换,从而转换所有可能的案例。当然,也不一定所有情况下都应该使用regex_replace进行转换。虽然正则表达式允许识别和解析最复杂的字符串。
您也可以尝试使用一种模式进行转换,如果它 returns null
则尝试使用另一种模式进行转换,依此类推:
coalesce(unix_timestamp(regexp_replace(str,'^(\d{4}-\d{2}-\d{2})[T ](\d{2}:\d{2}:\d{2})',' ')),
unix_timestamp(regexp_replace(str,'^(\d{2})-(\d{2})-(\d{4})[T ](\d{2}:\d{2}:\d{2})','-- '))
)
我正在尝试在时间戳之间执行减法,并希望将时间戳转换为可以转换为分钟的形式。
我使用 regexp_replace 将时间戳转换成这样的形式:
2020-06-20T17:25:59:378Z
下面的代码会将其转换为秒
unix_timestamp(regexp_replace(value,'(.*?)T(.*?):([^:]*?)Z$',' \.'))
我还有另外两个时间戳要转换成秒,例如:
2020-03-19 15:45:33
03-19-2020 11:07:25:103
我应该如何使用 regexp_replace() 或任何其他函数将这两个时间戳转换为秒?
谢谢!
对于第一个你真的不需要使用regex_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_timestamp
returns 秒从 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})',' '))
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})','-- '))
end result_unix_timestamp
from your_data
Returns:
result_unix_timestamp
1592673959
1584632733
1584616045
您可以在案例中添加更多的模式并进行相应的转换,从而转换所有可能的案例。当然,也不一定所有情况下都应该使用regex_replace进行转换。虽然正则表达式允许识别和解析最复杂的字符串。
您也可以尝试使用一种模式进行转换,如果它 returns null
则尝试使用另一种模式进行转换,依此类推:
coalesce(unix_timestamp(regexp_replace(str,'^(\d{4}-\d{2}-\d{2})[T ](\d{2}:\d{2}:\d{2})',' ')),
unix_timestamp(regexp_replace(str,'^(\d{2})-(\d{2})-(\d{4})[T ](\d{2}:\d{2}:\d{2})','-- '))
)