我有一个字符串'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”。我的挑战是如何做到这一点,而不需要混乱的子串串联。
5条答案
按热度按时间h7wcgrx31#
我认为这件事不能不搞砸。因为根据unix\u timestamp()函数文档,它返回的时间是秒,因此将忽略毫秒部分。
“将具有给定模式的时间字符串转换为unix时间戳(以秒为单位),如果失败,则返回0:unix\u timestamp('2009-03-20','yyyy-mm-dd')=1237532400。”
这里最好的选择是编写一个udf来处理这个问题,因为您希望避免混乱的连接。然而,串联(尽管很混乱)会更好的工作。
tzdcorbm2#
我在表单2015-07-22t09:00:32.956443z中有日期字段(存储为字符串)。我需要做一些约会操作。下面的命令虽然有点凌乱,但对我来说效果很好:)
这看起来很混乱,但如果你把它分解的话就很容易了。用毫秒提取日期和时间,并在两者之间加一个空格,然后加上整个事件并将其转换为时间戳。现在它可以用于日期或时间戳操作。
bwitn5fc3#
我找到了一种避免子字符串混乱串联的方法,使用以下代码:
5anewei64#
假设您的表中有一个字符串格式的“birth\u date”列,您应该使用下面的查询来使用birth\u date进行筛选
您可以按以下方式在查询中使用它
im9ewurl5#
一个简单的策略就是
date_format(arg1, arg2)
,在哪里arg1
时间戳是格式化字符串、日期或时间戳arg2
字符串的格式(以arg1
). 参考SimpleDateFormat
格式参数中可接受的内容的java文档。所以,在这种情况下:
将产生以下字符串:
'2014-10-14 12:34:56.789'
然后可以转换为时间戳:上面的语句将返回timestamp(根据需要)。