2016-04-19 13 views
0

"YYYY-MM-DD;HH:MM:SS"(つまり2016-04-11;19:38:01)の形式の日時を表すstringを適切なtimestampに変換するにはどうすればよいですか?文字列をインパラのタイムスタンプに変換する

これはうまくいくと思っていましたが、そうではありません。

select 
    from_unixtime(unix_timestamp(`date`, "YYYY-MM-DD;HH:MM:SS")) 
from t1 
limit 100; 
+2

「警告:日付/時刻変換の形式が正しくない:YYYY-MM-DD; HH:MM:SS」を返します。マニュアルを読むと、大文字と小文字が区別されます。ここは:http://www.cloudera.com/documentation/enterprise/latest/topics/impala_datetime_functions.htmlです。 from_unixtimeのセクションを探して、unix_timestampでフォーマットを使用する方法を説明しています。 – jbapple

答えて

4

私の質問に@jbappleが示唆しているように、問題は大文字になります。

現在インパラのドキュメントで述べたように、フォーマット文字列は、特に にヶ月分とMのためメートルを区別し、大文字と小文字が区別されます。インパラ1.3以降では、 要素の順序を変更し、代替セパレータ 文字を使用し、各ユニットに異なる数のプレースホルダを使用できます。 y、d、Hなどのインスタンスをさらに追加すると、出力文字列 が要求された文字数にゼロパディングされます。例外は月間M であり、Mは3などの浮き彫りのない値を生成し、MMは のように0を埋め込み、MMMは月などの短縮月名 を生成し、4以上のM許可されていません。すべてのフィールドを含む日付 文字列は、 "yyyy-MM-dd HH:mm:ss.SSSSS"、 "dd/MM/yyyy HH:mm:ss.SSSSS"、 "MMM dd、yyyy HH.mm.ss" (SSSSSS)」または 他のプレースホルダと区切り文字の組み合わせ。

それを書くの正しい方法は次のとおりです。

select 
    from_unixtime(unix_timestamp(`date`, "yyyy-MM-dd;HH:mm:ss")) 
from t1 
limit 100; 
4

from_unixtime()の戻り値の型は、「適切なtimestamp」が、文字列ではありません。 (返品タイプはunix_timestamp()ではなく、timestampですが、bigintです)。ここで

は、私がtimestamp戻り値の型を取得するために何をすべきかです:ここでは、完全を期すために

select 
    cast(unix_timestamp(`date`, "yyyy-MM-dd;HH:mm:ss") as timestamp) 
from t1 
limit 100; 

を、私はタイムゾーンを扱う方法ですローカルにフォーマットされた日付、およびUTCタイムスタンプとしてそれらを保存する:

select 
    to_utc_timestamp(cast(unix_timestamp(`date`, "yyyy-MM-dd;HH:mm:ss") as timestamp), "Europe/Paris") 
from t1 
limit 100; 

これは、-use_local_tz_for_unix_timestamp_conversions起動フラグがオフであることを前提としています(これがデフォルトです)。

関連する問題