2017-04-05 14 views
0

このクエリ:select EXTRACT(HOUR FROM 1435047532) as hour from TABLENAME;
このエラーを返します。 "抽出元の抽出フィールドが無効です"。
私は与えられたタイムスタンプから時間を抽出しようとしています。たぶん問題は、タイムスタンプフィールドのフォーマットがTIMESTAMPではなくNUMBERですか?タイムスタンプからのSQL抽出時間

+3

1435047532は単なる数字です。日付/時刻としてどのように解釈されるかを定義する必要があります。例えば。 1600-01-01T00:00:00以来、Unixエポックから10秒間隔かそれとも数秒かですか? – Richard

+0

@リチャード私はフォーマットがNUMBERであることを指定して編集しました。それで、あなたは正しいのです。それは、Uniix時代から数秒です。それらを正しいフォーマットに変換するには? – Caramelleamare

+0

本当にタイムスタンプが必要なときに、なぜこのようなUNIX番号を保存していますか?私はあなたのテーブルデザインを変更して 'date'(本当にdatetime)か' timestamp'(つまり、新しい列を作成し、ist値を計算し、古い列を削除する)に切り替えることをお勧めします。 –

答えて

0

あなたが使用してTIMESTAMPタイプにあなたの数値秒-以来のエポックの時間を変換することができ、この

select extract(hour from (select to_date('19700101', 'YYYYMMDD') 
+ (1/24/60/60) * 1435047532 from dual)) from dual 
+1

'ORA-30076:ソースの抽出に無効なフィールド'が表示されます。時間を抽出するには、 'TIMESTAMP'を使用する必要があります。 – MT0

1

を試してみてください:だから時間を取得するために

TIMESTAMP '1970-01-01 00:00:00' + NUMTODSINTERVAL(your_time_since_epoch, 'SECOND') 

SELECT EXTRACT(HOUR FROM TIMESTAMP '1970-01-01 00:00:00' 
          + NUMTODSINTERVAL(1435047532, 'SECOND')) 
FROM DUAL; 

うるう秒を処理する必要がある場合は、to create a function/package to handle thisが必要です。

+1

私たちは既にこの議論をしました。 Unixタイムスタンプはうるう秒をサポートしていません。しかし、 '1970-01-01 00:00:00'は常にローカルではなくUTC時刻として与えられると考えるかもしれません。これはあなたの答えに対する批判ではありませんが、特定のニーズに合わせてそれを適応させるヒントです。 –

+1

@WernfriedDomscheitタイムスタンプが特定のタイムゾーン(すなわちPST)で必要な場合、それは 'FROM_TZ(TIMESTAMP '1970-01-01 00:00:00' + NUMTODSINTERVAL(your_time_since_epoch、 'SECOND') ' UTC ')時間帯「PST」で。 – MT0

関連する問題