Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

Oracle sql - किसी फ़ंक्शन के भीतर दिनांक घटाव

मामूली समस्या यह है कि आप एक ; . खो रहे हैं जब आप v_depart . को परिभाषित करते हैं , और पंक्ति के अंत में आप v_duration . को मान निर्दिष्ट करते हैं; और आप अपने चर नामों को मिला रहे हैं। (आप car_info.id . के प्रकार के बारे में भी असंगत हैं; आपने इसे varchar . के रूप में बनाया है जब यह शायद एक संख्या होनी चाहिए, लेकिन यह आपके पिछले प्रश्न पर एक टिप्पणी है)।

मुख्य समस्या यह है कि आप दो स्ट्रिंग्स पर माइनस नहीं कर सकते, क्योंकि इसका वास्तव में कोई मतलब नहीं है। आपको मूल तिथियों में हेरफेर करने की आवश्यकता है, और फिर यह पता लगाएं कि आप कॉलर को परिणाम कैसे वापस करना चाहते हैं।

एक तारीख को दूसरी से घटाना एक संख्या मान देता है, जो कि दिनों की संख्या है; आंशिक दिन भिन्न हैं, इसलिए 0.25 6 घंटे है। आपके पिछले quesiton की तारीखों के साथ, यह प्रश्न:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORACLE SQL में MAX ()

  2. एंटिटी फ्रेमवर्क में क्वेरी को ऑप्टिमाइज़ करने के लिए CAST AS को अक्षम करें

  3. Oracle में शेष () फ़ंक्शन के व्यवहार को समझना

  4. 12c डेटा रिडक्शन

  5. Oracle 10g समय क्षेत्र भ्रम