我有一个字符串'20141014123456789',它表示我需要转换为Hive(0.13.0)中的时间戳而不会丢失毫秒的时间戳(毫秒)。
我尝试了这个,但unix_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'。我的挑战是如何在没有子串的混乱连接的情况下做到这一点。
答案 0 :(得分:9)
我找到了一种方法,可以使用以下代码避免混乱的子串连接:
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)
答案 1 :(得分:0)
我不认为这可以在没有混乱的情况下完成。因为根据unix_timestamp()函数文档,它返回的时间是秒,因此将省略毫秒部分。
“将给定模式的时间字符串转换为Unix时间戳(以秒为单位),如果失败则返回0:unix_timestamp('2009-03-20','yyyy-MM-dd ')= 1237532400。“
这里最好的选择是编写一个UDF来处理这个你想避免混乱的连接。然而,连接(虽然凌乱)对工作会更好。
答案 2 :(得分:0)
我的日期字段为 2015-07-22T09:00:32.956443Z (存储为字符串)。我需要做一些日期操作。 以下命令即使有点凌乱也不适合我:)
select cast(concat(concat(substr(date_created,1,10),' '),substr(date_created,12,15)) as timestamp) from tablename;
这看起来令人困惑但如果你把它分解就很容易了。 用毫秒提取日期和时间,并在其间连接一个空格,然后连接整个事物并将其转换为时间戳。现在,这可以用于日期或时间戳操作。
答案 3 :(得分:0)
假设您的表格中有一列'birth_date',它是字符串格式, 您应该使用以下查询来使用birth_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';
答案 4 :(得分:-1)
一个简单的策略是使用date_format(arg1, arg2)
,其中arg1
是时间戳,可以是格式化的字符串,日期或时间戳,arg2
是字符串的格式(在{中{1}})。有关format参数中可接受的内容,请参阅arg1
java文档。
所以,在这种情况下:
SimpleDateFormat
将产生以下字符串:date_format('20141014123456789', 'yyyyMMddHHmmssSSS')
,然后可以将其转换为时间戳:
'2014-10-14 12:34:56.789'
上述语句将返回时间戳(根据需要)。