"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية حساب ساعات العمل بين تاريخين في Oracle SQL؟

كيفية حساب ساعات العمل بين تاريخين في Oracle SQL؟

نشر في 2025-02-06
تصفح:903

How to Calculate Business Hours Between Two Dates in Oracle SQL?

حساب الساعات على أساس ساعات العمل في Oracle SQL

في Oracle SQL ، يمكن أن يكون حساب الساعات بين فترتين زمنيتين مباشرة. ومع ذلك ، إذا كنت بحاجة إلى عامل في ساعات العمل ، يصبح الحساب أكثر تعقيدًا.

مواصفات ساعات العمل

أنا حتى الساعة 6:00 مساءً. لدمج هذه الساعات في الحساب ، يمكنك استخدام مجموعة من معالجة التاريخ والمنطق الشرطي. بناءً على ساعات العمل المحددة:

حدد المهمة ، start_time ، end_time ، دائري( (( - احسب فرق الأسابيع الكاملة من بداية أسابيع ISO. (trunc (end_time ، 'iw') - trunc (start_time ، 'iw')) * (10/24) * (6/7) - أضف الأيام الكاملة للأسبوع الأخير. على الأقل (trunc (end_time) - trunc (end_time ، 'iw') ، 6) * (10/24) - قم بطرح الأيام الكاملة من أيام الأسبوع قبل تاريخ البدء. - أقل (trunc (start_time) - trunc (start_time ، 'iw') ، 6) * (10/24) - أضف ساعات اليوم الأخير على الأقل (أعظم (end_time - trunc (end_time) - 8/24 ، 0) ، 10/24) - قم بطرح ساعات اليوم قبل بدء النطاق. - على الأقل (أعظم (start_time - trunc (start_time) - 8/24 ، 0) ، 10/24) ) - اضرب لإعطاء دقائق بدلاً من الكسور من الأيام الكاملة. * 24 ، 15 - عدد الأماكن العشرية ) كما work_day_hours_diff من your_table ؛

التفسير

') و trunc (start_time ،' iw '). تعطي هذه الحسابات تواريخ البدء والنهاية لأسابيع ISO التي تحتوي على بداية ونهاية المهمة. الأيام في بداية ونهاية النطاق ، حيث قد لا تنطبق ساعات العمل.

SELECT task,
       start_time,
       end_time,
       ROUND(
         (
           -- Calculate the full weeks difference from the start of ISO weeks.
           ( TRUNC( end_time, 'IW' ) - TRUNC( start_time, 'IW' ) ) * (10/24) * (6/7)
           -- Add the full days for the final week.
             LEAST( TRUNC( end_time ) - TRUNC( end_time, 'IW' ), 6 ) * (10/24)
           -- Subtract the full days from the days of the week before the start date.
           - LEAST( TRUNC( start_time ) - TRUNC( start_time, 'IW' ), 6 ) * (10/24)
           -- Add the hours of the final day
             LEAST( GREATEST( end_time - TRUNC( end_time ) - 8/24, 0 ), 10/24 )
           -- Subtract the hours of the day before the range starts.
           - LEAST( GREATEST( start_time - TRUNC( start_time ) - 8/24, 0 ), 10/24 )
         )
         -- Multiply to give minutes rather than fractions of full days.
         * 24,
         15 -- Number of decimal places
       ) AS work_day_hours_diff
FROM   your_table;
الفرق في ساعات اليوم الأخير واليوم السابق يتم حساب النطاق بشكل مشابه.

الضرب:

يعرض الحساب النهائي النتيجة بمقدار 24 لتحويل الدقائق إلى ساعات.
  • مع بيانات العينة المقدمة:
  • المهمة | start_time | end_time أ | 16-17 يناير. 10:00 | 23 يناير 17 11:35 ب | 18 يناير 17 17:53 | 19 يناير 17 08:00 ج | 13 يناير 17 13:00 | 17 يناير 17 14:52 د | 21-7 يناير. 10:00 | 30-JAN-17 08:52 يخرج الاستعلام عن النتائج التالية:
  • end_time &&&&&] 2017-01-23 11:35:00 (mon)
  • 61.5833333333333333 00 (الأربعاء)
  • 2017-01-19 08:00:00 (الخميس)

. 11666666666667 2017-01-13 13:00:00 (FRI)

2017-01-17 14:52:00 (الثلاثاء) ] d

2017-01-21 10:00:00 (SAT)
TASK | START_TIME | END_TIME
A | 16-JAN-17 10:00 | 23-JAN-17 11:35
B | 18-JAN-17 17:53 | 19-JAN-17 08:00
C | 13-JAN-17 13:00 | 17-JAN-17 14:52
D | 21-JAN-17 10:00 | 30-JAN-17 08:52
2017-01-30 08:52:00 (mon)

تعكس هذه النتائج بدقة عدد ساعات العمل بناءً على ساعات العمل المحددة.
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3