2012-03-02 14 views
0

(前のポストから移動) - これは繰り返しと見なされてもごめんなさい! こんにちは皆、 ちょうど日付計算と関数内の日付から減算でいくつかの問題があります。関数内のOracle sql-dateの減算

私はdate to_charから例えばto_charに変換する必要があるため、私が使用しているはずのデータ型と混同しています。戻り値の型をvarchar2またはdateのどちらにするかわからないのですか?ここで

はcar_idを受け取る関数であり、その車のためのテーブルに見えるが、車を引き出す日に到着し、格納した日付変数

で出発日と同じことを行います。

次に、両方の日付を_charに変換し、減算してvarchar2に返します。

私は関数を呼び出すと、パラメータとしてcar_idを入力し、 dbms出力のために返された結果をvarchar変数に格納します。例えば、 。ここ

v_result := get_duration('0001') 

は関数である。

DROP FUNCTION get_duration; 
CREATE FUNCTION get_duration (p_car_id number) 
RETURN varchar2 is 
v_arrive date; 
v_depart date 
v_duration varchar2(25); --not too sure about this variable choice 

begin 

select arrival, departure 
into v_arrive, v_depart 
from car_info 
where car_id = p_car_id; 

v_duration := to_char(v_depart, 'dd-mon-yyyy hh24:mi:ss') - to_char(v_arrive, 'dd-mon-yyyy hh24:mi:ss') 
return v_duration; 
END; 
/

あなたが見ることができるように、私はその後、変数へのテーブルから開始時間と終了時間を置くしようとしてマイナス開始から終了日午前日付。

機能コンパイルが、警告と、私は、エラーが関数を呼び出すようになったとき:ポストがある場合get_durationが無効である

この上の任意の入力が大幅に受信されるだろう、

申し訳ありません比較的大きい!

に関して、

ダレン

+0

'v_stop'と' v_start'が宣言されていないと、どのようにコンパイルされますか? – Ollie

+1

@Ollie - '警告:コンパイルエラーで関数が作成されました.' * 8-)。前回のQでは、 'show errors'の出力を提供することを提案しました。 –

答えて

2

些細な問題は、あなたがv_departを定義するときに;が欠けていることであり、行の最後に、あなたはv_durationに値を割り当てます。あなたは変数名を混ぜています。 (またcar_info.idのタイプに関する矛盾している、あなたはvarcharとき、それはおそらく数であるべき、それがあなたの前の質問にコメントの多くはであるとして、それを作成しました)。

主な問題は、2つの文字列でマイナスを実行できないということです。実際には意味がありません。元の日付を操作して、結果を呼び出し元に返す方法を理解する必要があります。

別の日付から1を引くと、数値である日数が与えられます。部分日数は分数なので、0.25は6時間です。以前のquesitonからの日数、このクエリでは:

select arrival, departure, departure - arrival as duration 
from car_info 
where car_id = 1; 

... 2日と3時間である2.125、時間を示しています。

これは、これを行うための最善の方法はありませんが、私はその期間の番号を使用し、非常に長いったらしい方法で文字列に変換しますに何が起こっているかのプロセスを表示するには:

CREATE OR REPLACE FUNCTION get_duration (p_car_id number) 
RETURN varchar2 is 
    v_arrive date; 
    v_depart date; 
    v_duration number; 
    v_days number; 
    v_hours number; 
    v_minutes number; 
    v_seconds number; 
BEGIN 

    select arrival, departure, departure - arrival 
    into v_arrive, v_depart, v_duration 
    from car_info 
    where car_id = p_car_id; 

    -- Days is the whole-number part, which you can get with trunc 
    v_days := trunc(v_duration); 
    -- Hours, minutes and seconds are extracted from the remainder 
    v_hours := trunc(24 * (v_duration - v_days)); 
    v_minutes := trunc(60 * (v_duration - v_days - (v_hours/24))); 
    v_seconds := trunc(60 * (v_duration - v_days - (v_hours/24) 
     - (v_minutes/(24*60)))); 

    return v_days || ' days ' 
     || to_char(v_hours, '00') || ' hours ' 
     || to_char(v_minutes, '00') || ' minutes ' 
     || to_char(v_seconds, '00') || ' seconds'; 
END; 
/

Function created. 

show errors 

No errors. 

select get_duration(1) from dual; 

GET_DURATION(1) 
-------------------------------------------------------------------------------- 
2 days 03 hours 00 minutes 00 seconds 

数値形式のマスクなどで再生して、必要な出力を得ることができます。

+0

+1、時、分、秒などの出力の場合 – Ollie

+0

うわー!私のために多くの努力に行ってくれてありがとう、これは非常に便利です!優れた答えと感謝をもう一度 – DarrenJ65

2

算術VARCHAR2Sの日付ではない上で動作DATE:

CREATE FUNCTION get_duration (p_car_id number) 
RETURN varchar2 is 
v_arrive date; 
v_depart date 
v_duration number; --<<< 

begin 

select arrival, departure 
into v_arrive, v_depart 
from car_info 
where car_id = p_car_id; 

v_duration := v_arrive - v_depart; 
return v_duration; 
END; 

日で結果が得られること。

+1

'v_stop'と' v_start'を 'v_arrive'と' v_depart'に置き換えてコンパイルする(戻り値の型を 'NUMBER'に変更する)ことができます。 – Ollie

+0

@Ollie、ありがとう! –

+0

ええ、申し訳ありませんが、それは入力からエラーでした、私は別のプロジェクトと混乱していた!私の実際のコードではこれはそうではありません – DarrenJ65

0

は、一度varchar2にキャストすると(to_char関数はそれを実行します)、日付を減算できません。代わりにv_duration := v_stop - v_start;を使用してください。結果は「v_duration」になります。そして、あなたが時間、分、などに変換することができます。..