2016-10-17 16 views
0

oracle SQLで別の問合せから戻された日付とシステム時刻の減算操作を実行したいとします。これまでのところ私は、別のクエリの結果を使用することができたが、私はそれは私に次のエラーoracleのsystimestampから日付を減算する問合せ11g

ORA-01722与えSYSTIMESTAMPから減算しようとすると:無効な番号
「01722を。 00000 - 無効な番号
*原因:指定された番号が無効です。
*処置:有効な番号を指定してください。以下は

また、私は時間間隔との差が、時間になりたいこの

select to_char(sys_extract_utc(systimestamp)-e.last_time,'YYYY-MM-DD HH24:MI:SS') as lag 
from (
    select ATTR_VALUE as last_time 
    from CONFIG 
    where ATTR_NAME='last_time' 
    and PROCESS_TYPE='new' 
) e; 

を試してみましたが、私のクエリ

select round(to_number(systimestamp - e.last_time) * 24) as lag 
from (
    select ATTR_VALUE as last_time 
    from CONFIG 
    where ATTR_NAME='last_time' 
    and PROCESS_TYPE='new' 
) e; 

です。

ありがとうございました。

P.S. ATTR_VALUEのデータ型はVARCHAR2(150)です。 e.last_timeのサンプル結果は「そのVARCHAR2(150)。私は今までにそれを変換する必要があることを意味し、」2016-09-05 22:43:81796

+1

に丸めどのデータ型ATTR_VALUEですか? – sers

+0

@sersそうですね、私が見る通り、VARCHAR2(150)です。つまり、これを日付に変換する必要があることを意味します –

+0

なぜ 'DATE'を' VARCHAR'として保存していますか?それをしないでください。 –

答えて

0

だから最終的には試行錯誤の多くの後、私はこの1

1.e.last_timeのdata_typeがVARCHAR(150)だったので、最初は誤りだったが判明しました。私は私の場合、私は2つのオプションto_timestampto_dateを持つシステム時間にVARCHARを変換するにはdesc CONFIG

2.

desc <table_name> 

を使用し、テーブル内の指定された列のデータ型を調べるに 。私は

select round((systimestamp - to_timestamp(e.last_time,'YYYY-MM-DD HH24:MI:SSSSS')) * 24, 2) as lag 
from (
    select ATTR_VALUE as last_time 
    from CONFIG 
    where ATTR_NAME='last_time' 
    and PROCESS_TYPE='new' 
) e; 

ようto_timestampを使用している場合、私は、日付の差は+41 13:55:20.663990ようになり出てくるので、ラウンドがNUMBERを期待してINTERVAL DAY TO SECONDSを得たエラーを取得します。それを1時間に変換するには、複雑なロジックが必要です。

代替案は、Iが好ましく、

select round((sysdate - to_date(e.last_time,'YYYY-MM-DD HH24:MI:SSSSS')) * 24, 2) as lag 
from (
    select ATTR_VALUE as last_time 
    from CONFIG 
    where ATTR_NAME='last_time' 
    and PROCESS_TYPE='new' 
) e; 

このとしてそれを使用しto_dataを使用することである私に、所望の結果を返す、すなわち時間の差が2フローティング桁

+0

無関係ですが、ここでは派生テーブルは無用です。あなたは普通の選択でそれを行うこともできます。 –

+0

@a_horse_with_no_nameそれでは、どのように文を更新しますか?私はこれが複雑だと感じています –

+0

うーん、興味深い日付フォーマットがあります。 'SSSSS'は真夜中からの秒数です。したがって、 'HH24:MI'ビットでは倍となります。あなたの特定の結果の結果に大きな影響を与えるものではありませんが、この種のソフトコード化された構成表がなぜこのような悪い考えであるかを示しています。 – APC

1

ある

ATTR_VALUEをので、はい、あなたが正しいに変換する必要があり、文字列でありますそれを別のデータ型と比較しようとする前に入力してください。あなたのサンプルデータを指定して、適切なタイプは、あなたのサブクエリがあるべき場合には、タイムスタンプのようになります。

(
    select to_timestamp(ATTR_VALUE, 'yyyy-mm-dd hh24:mi:ss.ff5') as last_time 
    from CONFIG 
    where ATTR_NAME='last_time' 
    and PROCESS_TYPE='new' 
) 

仮定はあなたのサンプルが与えられたキーのためにあなたのCONFIGテーブル内のすべての値の代表であるということです。異なるフォーマットの値がある場合、クエリは別の方法で中断されます。これがこのアプローチを使用する危険です。

+0

私の価値がVARCHARであることを知った後、今はto_dateを使いました。あなたの質問も同じことになります。私は1日に1日間隔を取得し、それを数時間に変換する必要があります。 '+41 13:33:07.632492'は私が得た結果です。これを時間に変換する方法がわかりません –

+0

最後にこれを解決できました。私の答えを見て、 'to_timestamp'と' systimestamp'の代わりに 'to_date'と' sysdate'を使いました。助けてくれてありがとう –