文字列「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」に再フォーマットする必要があると思います。私の挑戦は、部分文字列の乱雑な連結なしでそれを行う方法です。
次のコードを使用して、部分文字列の乱雑な連結を回避する方法を見つけました。
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)
この形式の日付フィールドがありました2015-07-22T09:00:32.956443Z(文字列として保存)。私はいくつかの日付操作を行う必要がありました。次のコマンドは少し面倒ですが、私にとってはうまくいきました:)
select cast(concat(concat(substr(date_created,1,10),' '),substr(date_created,12,15)) as timestamp) from tablename;
これは紛らわしいように見えますが、分解すれば非常に簡単です。ミリ秒で日付と時刻を抽出し、間にスペースを連結してから、全体を連結してタイムスタンプにキャストします。現在、これは日付またはタイムスタンプの操作に使用できます。
テーブルに文字列形式の列「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';
面倒なことをせずにこれができるとは思いません。 unix_timestamp()関数のドキュメントによると、時間は秒であるため、ミリ秒の部分は省略されるためです。
"指定されたパターンの時間文字列をUnixタイムスタンプに変換(秒)、失敗した場合は0を返します:unix_timestamp( '2009-03- 20 '、' yyyy-MM-dd ' 1237532400。 ")==
ここでの最善のオプションは、これを処理するUDFを記述することです。これは、乱雑な連結を避けたい場合です。ただし、連結は(面倒ではありますが)仕事に適しています。
単純な戦略は、date_format(arg1, arg2)
を使用することです。ここで、arg1
は、書式設定された文字列、日付、またはタイムスタンプとしてのタイムスタンプとarg2
は文字列の形式です(arg1
)。 format引数で受け入れられるものについては、SimpleDateFormat
Javaのドキュメントを参照してください。
したがって、この場合:
date_format('20141014123456789', 'yyyyMMddHHmmssSSS')
次の文字列が生成されます:'2014-10-14 12:34:56.789'
その後、タイムスタンプとしてキャストできます。
cast(date_format('20141014123456789', 'yyyyMMddHHmmssSSS') as timestamp)
上記のステートメントは、(必要に応じて)タイムスタンプを返します。