2017-06-20 1 views
1

J'ai une chaîne 2013-01-01 12:00:01.546 qui représente un timestamp avec millisecondes que j'ai besoin de convertir en bigint sans perdre les millisecondes.Comment convertir la date de la chaîne en grand int dans la ruche en millisecondes

J'ai essayé unix_timestamp mais je perds les millisecondes:

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 

I Tried au format millisecondes ainsi, mais pas de différence

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

Est-il possible d'obtenir millisecondes différence dans la ruche?

Répondre

0

Donc, apparemment, unix_timestamp ne convertit pas les millisecondes. Vous pouvez utiliser l'approche suivante.

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

Si vous allez prendre un autre regard sur vos résultats de test vous ' On verra que le résultat est en ** secondes **. Les millisecondes ont été tronquées. –

+0

@DuduMarkovitz Merci. J'ai édité. Cela semble bien, non? – philantrovert

+0

Pourquoi cela devrait-il faire une différence? :-) Même résultat ... –

2

C'est ce que je suis venu avec jusqu'à présent.
Si tous vos horodatages ont une fraction de 3 chiffres, ils peuvent être simplifiés.

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 

Vérification du résultat:

select from_utc_timestamp (1357070401546,'UTC') 

2013-01-01 12: 00: 01,546000

+0

Un aimable rappel pour accepter la réponse (en marquant le symbole ** V ** à gauche de la réponse) –