SQL: tugas waktu kerja

Halo, Radio SQL kembali mengudara! Uleni ganglia, sebarkan pseudopodia (atau sebaliknya?) Dan dengarkan gelombang gravitasi kita!


Terakhir kali, saya hampir dikucilkan untuk parsing ( https://habr.com/en/post/359064/ ) masalah Olympiad SQL, konon itu tidak cukup dekat dengan kehidupan. Seolah-olah tag "pemrograman tidak normal" dan "Olimpiade" tidak berbicara sendiri. Tapi jelas tidak ada yang membaca tag! Namun demikian, saya akan melanjutkan topik tugas parsing dalam bahasa pemrograman SQL yang indah. Karena cakar (gatal).

Hari ini kita dihadapkan dengan tugas yang secara eksklusif mengancam jiwa, dan bahkan tugas yang praktis. Saya berlari ke dalamnya, mencoba menghitung kinerja SLA berdasarkan permintaan dari pengguna yang penuh kasih. Inti dari masalah awal adalah sebagai berikut: perlu untuk menghitung durasi pekerjaan untuk setiap aplikasi dan membandingkan dengan apa yang kami janjikan. Semuanya akan baik-baik saja, tetapi waktu dalam kewajiban dinyatakan bekerja, dan dari perubahan status dalam aplikasi saya hanya bisa mendapatkan kalender. Dan inilah sebuah pemikiran! Ini dia, tugas! Tidak terlalu rumit, tetapi juga tidak sepenuhnya sepele. Hanya untuk meregangkan bagian pusat sistem saraf otonom Anda, membuatnya lebih simpatik!

Jadi, saya nyatakan kondisinya.

Ada beberapa interval waktu yang ditentukan oleh tanggal-waktu awal dan akhir (contoh dalam sintaks 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) ) 

Diperlukan dalam satu query SQL (c) untuk menghitung durasi setiap interval dalam jam kerja. Kami percaya bahwa kami bekerja pada hari kerja dari Senin hingga Jumat, jam kerja selalu dari 10:00 hingga 19:00. Selain itu, sesuai dengan kalender produksi Federasi Rusia, ada sejumlah hari libur resmi yang bukan hari kerja, dan beberapa hari libur, sebaliknya, adalah hari kerja karena penundaan hari libur yang sama. Pemendekan hari pra-liburan tidak diperlukan, kami menganggapnya lengkap. Karena liburan bervariasi dari tahun ke tahun, yaitu, ditetapkan oleh daftar eksplisit, kami akan membatasi diri hanya untuk tanggal dari 2018 dan 2019. Saya yakin, jika perlu, solusinya dapat dengan mudah ditambahkan.

Perlu menambahkan satu kolom dengan durasi dalam jam kerja ke periode awal dari periode . Inilah hasilnya:

  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 

Kami tidak memeriksa data awal untuk kebenaran, kami selalu mempertimbangkan start_time <= stop_time .

Konstruk SQL dialek khusus PostgreSQL dapat digunakan, tetapi tidak disalahgunakan. Agar benar-benar tepat, saya menambahkan bahwa kueri harus dijalankan pada PostgreSQL versi 10 atau lebih baru.

Dalam sebulan akan ada analisis tugas. Saya tidak mengambil keputusan apa pun sehingga ada insentif untuk menyelesaikannya sendiri. Kami mohon - tempatkan kode di komentar di bawah spoiler!

Terakhir tapi tidak kalah pentingnya . Jika saya sudah berhasil memposting artikel ini di blog perusahaan Postgres Professional, kami akan menggunakan beberapa barang korporat: untuk solusi paling menarik untuk masalah ini, kami akan memainkan perjalanan gratis ke PGConf.Russia 2020 . Kriteria minat akan menjadi milik saya pribadi, ditambah kriteria rekan kerja yang saya anggap perlu berkonsultasi. Semoga beruntung

UPDATE! Sesuatu yang saya lihat bahwa jam kerja dirasakan karena alasan tertentu secara eksklusif tanpa menit kerja. Jangan lupa menit! Saya menyesuaikan interval awal dan jawaban yang diharapkan untuk menekankan ketersediaan menit.

Ringkasan UPDATE2 : https://habr.com/en/company/postgrespro/blog/457722/ .

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


All Articles