sql >> データベース >  >> RDS >> Oracle

Oraclesql-関数内の日付減算

    些細な問題は、;が欠落していることです。 v_departを定義するとき 、行の最後で、値をv_durationに割り当てます。;そして、あなたはあなたの変数名を混同しています。 (car_info.idのタイプについても一貫性がありません; varcharとして作成しました おそらく数字であるはずですが、それはあなたの前の質問に対するコメントです。

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

    ある日付を別の日付から引くと、日数である数値が得られます。部分日は分数であるため、0.25は6時間です。以前の質問の日付を使用して、このクエリ:

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

    ...は2.125の期間を示しています。これは2日3時間です。

    これはこれを行うための最良の方法ではありませんが、何が起こっているのかを示すために、その期間の数値を使用して、かなり長い方法で文字列に変換します:

    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
    

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



    1. Entity Framework/Linq to SQL:スキップ &テイク

    2. 顧客データと注文データを組み合わせるための3番目のレポートを取得する方法

    3. 非常に大きなテーブルでのMysqlカウントのパフォーマンス

    4. プロファイルを使用してOracleのパスワードとリソースを管理する