سؤال
لماذا ليس لي وظيفة مدة PL / SQL تعمل بشكل صحيح؟ في الاستعلام أدناه، I يدويا حساب "HH: MM" بنفس الطريقة كما هو الحال في وظيفة أدناه. ومع ذلك، وأحصل على نتائج مختلفة.
ودعوة الاستعلام:
WITH durdays AS (SELECT SYSDATE - (SYSDATE - (95 / 1440)) AS durdays FROM DUAL)
SELECT TRUNC (24 * durdays) AS durhrs,
MOD (TRUNC (durdays * 1440), 60) AS durmin,
steven.duration (SYSDATE - (95 / 1400), SYSDATE) duration
FROM durdays
وإخراج:
durhrs: 1
durmin: 35
duration: '1:38'
وكود الوظيفة:
CREATE OR REPLACE FUNCTION steven.duration (d1 IN DATE, d2 IN DATE)
RETURN VARCHAR2 IS
tmpvar VARCHAR2 (30);
durdays NUMBER (20,10); -- Days between two DATEs
durhrs BINARY_INTEGER; -- Completed hours
durmin BINARY_INTEGER; -- Completed minutes
BEGIN
durdays := d2-d1;
durhrs := TRUNC(24 * durdays);
durmin := MOD (TRUNC(durdays * 1440), 60);
tmpvar := durhrs || ':' || durmin;
RETURN tmpvar;
END duration;
/
المحلول
وأعتقد أنك قد يكون خطأ مطبعي صغير:
WITH durdays AS (SELECT SYSDATE - (SYSDATE - (95 / 1440)) AS durdays FROM DUAL)
^^^^
SELECT TRUNC (24 * durdays) AS durhrs,
MOD (TRUNC (durdays * 1440), 60) AS durmin,
lims_sys.duration (SYSDATE - (95 / 1400), SYSDATE) duration
^^^^
ومتى ما تم ذلك فهي ثابتة يعمل موافق:
SQL> WITH durdays AS (SELECT SYSDATE - (SYSDATE - (95 / 1440)) AS durdays FROM DUAL)
2 SELECT TRUNC (24 * durdays) AS durhrs,
3 MOD (TRUNC (durdays * 1440), 60) AS durmin,
4 duration (SYSDATE - (95 / 1440), SYSDATE) duration
5 FROM durdays
6 ;
DURHRS DURMIN DURATION
---------- ---------- ----------------
1 34 1:34
نصائح أخرى
sql>set time on
وبعد ذلك سوف تحصل على موجه مثل:
20:24:35 sql> select count(*) from v$session; count(*) ----------- 78 20:24:50 sql>
والآن يمكنك أن تأتي لمعرفة مدة الاستعلام هو 15sec في
لا تنتمي إلى StackOverflow