如何在配置单元中将字符串转换为毫秒时间戳

vdgimpew  于 2021-06-02  发布在  Hadoop
关注(0)|答案(5)|浏览(423)

我有一个字符串'20141014123456789',它表示一个带有毫秒的时间戳,我需要将它转换为配置单元(0.13.0)中的时间戳,而不会丢失毫秒。
我尝试了这个,但是unix\u timestamp返回一个整数,所以我丢失了毫秒:

from_unixtime(unix_timestamp('20141014123456789', 'yyyyMMddHHmmssSSS'))      >> 2014-10-14 12:34:56

投出一根弦是有效的:

cast('2014-10-14 12:34:56.789' as timestamp)      >> 2014-10-14 12:34:56.789

但我的字符串不是那种形式。
我想我需要将字符串的格式从“20141014123456789”改为“2014-10-14 12:34:56.789”。我的挑战是如何做到这一点,而不需要混乱的子串串联。

h7wcgrx3

h7wcgrx31#

我认为这件事不能不搞砸。因为根据unix\u timestamp()函数文档,它返回的时间是秒,因此将忽略毫秒部分。
“将具有给定模式的时间字符串转换为unix时间戳(以秒为单位),如果失败,则返回0:unix\u timestamp('2009-03-20','yyyy-mm-dd')=1237532400。”
这里最好的选择是编写一个udf来处理这个问题,因为您希望避免混乱的连接。然而,串联(尽管很混乱)会更好的工作。

tzdcorbm

tzdcorbm2#

我在表单2015-07-22t09:00:32.956443z中有日期字段(存储为字符串)。我需要做一些约会操作。下面的命令虽然有点凌乱,但对我来说效果很好:)

select cast(concat(concat(substr(date_created,1,10),' '),substr(date_created,12,15)) as timestamp) from tablename;

这看起来很混乱,但如果你把它分解的话就很容易了。用毫秒提取日期和时间,并在两者之间加一个空格,然后加上整个事件并将其转换为时间戳。现在它可以用于日期或时间戳操作。

bwitn5fc

bwitn5fc3#

我找到了一种避免子字符串混乱串联的方法,使用以下代码:

select cast(regexp_replace('20141014123456789', 
                           '(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{3})',
                           '$1-$2-$3 $4:$5:$6.$7') as timestamp)
5anewei6

5anewei64#

假设您的表中有一个字符串格式的“birth\u date”列,您应该使用下面的查询来使用birth\u date进行筛选

date_Format(birth_date, 'yyyy-MM-dd HH:mm:ssSSS')

您可以按以下方式在查询中使用它

select * from yourtable
where 
date_Format(birth_date, 'yyyy-MM-dd HH:mm:ssSSS') = '2019-04-16 07:12:59999';
im9ewurl

im9ewurl5#

一个简单的策略就是 date_format(arg1, arg2) ,在哪里 arg1 时间戳是格式化字符串、日期或时间戳 arg2 字符串的格式(以 arg1 ). 参考 SimpleDateFormat 格式参数中可接受的内容的java文档。
所以,在这种情况下:

date_format('20141014123456789', 'yyyyMMddHHmmssSSS')

将产生以下字符串: '2014-10-14 12:34:56.789' 然后可以转换为时间戳:

cast(date_format('20141014123456789', 'yyyyMMddHHmmssSSS') as timestamp)

上面的语句将返回timestamp(根据需要)。

相关问题