مزود: مهمة وقت العمل

مرحبا ، راديو مزود هو على الهواء مرة أخرى! يعجن العقد ، وانتشر كاذبة (أو العكس بالعكس؟) وضبط في موجة الجاذبية لدينا!


في آخر مرة ، كنت قد نبذت تقريبًا لتحليل ( https://habr.com/en/post/359064/ ) مشكلة Olympiad SQL ، من المفترض أنها لم تكن قريبة من الحياة. كما لو أن العلامات "البرمجة غير الطبيعية" و "الألعاب الأولمبية" لا تتحدث عن نفسها. ولكن من الواضح أن لا أحد يقرأ العلامات! ومع ذلك ، سوف أواصل موضوع تحليل المهام في لغة البرمجة الرائعة SQL. لأن الكفوف (حكة).

اليوم نواجه مهمة تهدد الحياة على وجه الحصر ، وحتى مهمة عملية. لقد واجهت ذلك ، في محاولة لحساب أداء جيش تحرير السودان بناء على طلبات من المستخدمين المحبين. جوهر المشكلة الأولية هو كما يلي: كان من الضروري حساب مدة العمل لكل تطبيق والمقارنة مع ما وعدنا به. سيكون كل شيء على ما يرام ، ولكن تم الإعلان عن أن الوقت اللازم للالتزامات يعمل ، ومن التغييرات في الحالة في التطبيقات يمكنني الحصول على التقويم فقط. وهنا الفكر! ها هي المهمة! ليست معقدة للغاية ، ولكن ليس تافها تماما أيضا. فقط لتمديد الأجزاء المركزية من الجهاز العصبي اللاإرادي ، مما يجعلها أكثر تعاطفا!

لذلك ، أنا أذكر الحالة.

هناك العديد من الفواصل الزمنية المحددة بواسطة التاريخ والوقت لبداية ونهاية (مثال في بناء جملة PostgreSQL):

with periods(id, start_time, stop_time) as ( values(1, '2019-03-29 07:00:00'::timestamp, '2019-04-08 14:00:00'::timestamp), (2, '2019-04-10 07:00:00'::timestamp, '2019-04-10 20:00:00'::timestamp), (3, '2019-04-11 12:00:00'::timestamp, '2019-04-12 16:07:12'::timestamp), (4, '2018-12-28 12:00:00'::timestamp, '2019-01-16 16:00:00'::timestamp) ) 

مطلوب في استعلام SQL واحد (ج) لحساب مدة كل فاصل زمني في ساعات العمل. نعتقد أننا نعمل في أيام الأسبوع من الاثنين إلى الجمعة ، وتكون ساعات العمل دائمًا من الساعة 10:00 إلى الساعة 19:00. بالإضافة إلى ذلك ، وفقًا لجدول الإنتاج في الاتحاد الروسي ، هناك عدد من أيام العطل الرسمية التي لا تعمل ، وبعض أيام العطلة ، على العكس من ذلك ، هي أيام عمل بسبب تأجيل تلك العطلات نفسها. تقصير أيام ما قبل العطلة ليس ضروريًا ، فنحن نعتبرها كاملة. نظرًا لاختلاف العطلات من عام إلى آخر ، أي ، يتم تعيينها من خلال قائمة صريحة ، سنحصر أنفسنا في التواريخ فقط من 2018 و 2019. أنا متأكد من أنه ، إذا لزم الأمر ، يمكن استكمال الحل بسهولة.

من الضروري إضافة عمود واحد مع المدة في ساعات العمل إلى الفترات الأولية من الفترات . هذه هي النتيجة:

  id | start_time | stop_time | work_hrs ----+---------------------+---------------------+---------- 1 | 2019-03-29 07:00:00 | 2019-04-08 14:00:00 | 58:00:00 2 | 2019-04-10 07:00:00 | 2019-04-10 20:00:00 | 09:00:00 3 | 2019-04-11 12:00:00 | 2019-04-12 16:07:12 | 13:07:12 4 | 2018-12-28 12:00:00 | 2019-01-16 16:00:00 | 67:00:00 

لا نتحقق من البيانات الأولية للتأكد من صحتها ؛ فنحن دائمًا نعتبر start_time <= stop_time .

يمكن استخدام تصميمات لهجة SQL الخاصة بـ PostgreSQL ، ولكن لا يتم إساءة استخدامها. لصحة كاملة للشروط ، أضيف أنه يجب تنفيذ الاستعلام على PostgreSQL الإصدار 10 أو الأحدث.

في شهر سيكون هناك تحليل لهذه المهمة. لا أتخذ أي قرارات حتى يكون هناك حافز لحلها بمفردي. نرجو منك - وضع الكود في التعليقات تحت المفسدين!

أخيرًا وليس آخرًا إذا تمكنت بالفعل من نشر هذه المقالة على مدونة Postgres Professional للشركات ، فسنستخدم بعض الأشياء الجيدة للشركات: من أجل الحل الأكثر إثارة للاهتمام لهذه المشكلة ، سنلعب رحلة مجانية إلى PGConf.Russia 2020 . ستكون معايير الاهتمام شخصيًا بالنسبة لي ، بالإضافة إلى معايير الزملاء الذين أرى أنه من الضروري التشاور معهم. حظا سعيدا

UPDATE! شيء أرى أنه يتم فهم ساعات العمل لسبب ما حصريًا دون دقائق عمل. لا تنسى الدقائق! قمت بضبط الفواصل الزمنية الأولى والإجابة المتوقعة للتأكيد على توفر الدقائق.

ملخص UPDATE2 : https://habr.com/ar/company/postgrespro/blog/457722/ .

Source: https://habr.com/ru/post/ar448368/


All Articles