2017-06-20 3 views
1

文字列2013-01-01 12:00:01.546timestampを表し、ミリ秒で表され、ミリ秒を失うことなくbigintに変換する必要があります。ミリ秒でハイブで文字列の日付をbig intに変換する方法

私はUNIX_TIMESTAMPみましたが、私はミリ秒を失う:

unix_timestamp(2013-01-01 12:00:01.546,'yyyy-MM-dd HH:mm:ss') ==> 1357059601 
unix_timestamp(2013-01-01 12:00:01.786,'yyyy-MM-dd HH:mm:ss') ==> 1357059601 

私もミリ秒の形式で試みたが、有意差

unix_timestamp(2013-01-01 12:00:01.786,'yyyy-MM-dd HH:mm:ss:SSS') ==> 1357059601 

はハイブのミリ秒の差を取得する方法はありませんか?

答えて

0

明らかにunix_timestampはミリ秒に変換されません。次の方法を使用できます。

hive> select unix_timestamp(cast(regexp_replace('2013-01-01 12:00:01.546', '(\\d{4})-(\\d{2})-(\\d{2}) (\\d{2}):(\\d{2}):(\\d{2}).(\\d{3})', '$1-$2-$3 $4:$5:$6.$7') as timestamp)); 
OK 
1357063201 
+0

あなたは取るよ場合あなたのテスト結果の別の一見は、結果は**秒**であることがわかります。ミリ秒は切り捨てられました。 –

+0

@DuduMarkovitzありがとう。私は編集しました。これは大丈夫だよね? – philantrovert

+0

なぜそれは何か違いがありますか? :-)同じ結果... –

2

これは私がこれまで行ってきたことです。
すべてのタイムスタンプが3桁の小数点を持つ場合は、単純化することができます。

with t as (select timestamp '2013-01-01 12:00:01.546' as ts) 
select cast ((to_unix_timestamp(ts) + coalesce(cast(regexp_extract(ts,'\\.\\d*',0) as decimal(3,3)),0)) * 1000 as bigint) 
from t 

結果の検証:

select from_utc_timestamp (1357070401546,'UTC') 

2013年1月1日12:00:01.546000

+0

答えを受け入れることを覚えておいてください(答えに** V **記号を付けてください) –

関連する問題