SQL: la tĂąche du temps de travail

Bonjour, Radio SQL est à nouveau diffusée! Pétrir les ganglions, propager des pseudopodes (ou vice versa?) Et syntoniser notre onde gravitationnelle!


La derniĂšre fois, j'ai Ă©tĂ© presque ostracisĂ© pour analyser ( https://habr.com/en/post/359064/ ) le problĂšme de l'Olympiade SQL, soi-disant il n'Ă©tait pas assez proche de la vie. Comme si les balises "programmation anormale" et "Jeux olympiques" ne parlaient pas d'elles-mĂȘmes. Mais Ă©videmment, personne ne lit les balises! NĂ©anmoins, je continuerai le sujet de l'analyse des tĂąches dans le merveilleux langage de programmation SQL. Parce que les pattes (dĂ©mangeaisons).

Aujourd'hui, nous sommes confrontés à une tùche exclusivement mortelle, voire pratique. Je suis tombé dessus, essayant de calculer les performances du SLA à la demande d'utilisateurs aimants. L'essence du problÚme initial est la suivante: il fallait calculer la durée du travail pour chaque candidature et comparer avec ce que nous avions promis. Tout irait bien, mais le temps dans les obligations a été déclaré fonctionnel, et à partir des changements de statut dans les applications, je n'ai pu obtenir que le calendrier. Et voici une pensée! La voici, tùche! Pas trop compliqué, mais pas tout à fait banal non plus. Juste pour étirer les parties centrales de vos systÚmes nerveux autonomes, les rendant plus sympathiques!

Donc, j'énonce la condition.

Il y a plusieurs intervalles de temps spécifiés par la date-heure de son début et de sa fin (un exemple dans la syntaxe 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) ) 

Il est requis dans une requĂȘte SQL (c) pour calculer la durĂ©e de chaque intervalle en heures de travail. Nous pensons que nous travaillons en semaine du lundi au vendredi, les heures de travail sont toujours de 10h00 Ă  19h00. En outre, conformĂ©ment au calendrier de production de la FĂ©dĂ©ration de Russie, il existe un certain nombre de jours fĂ©riĂ©s officiels qui ne sont pas des jours ouvrables, et certains jours de congĂ©, au contraire, sont des jours ouvrables en raison du transfert de ces mĂȘmes jours fĂ©riĂ©s. Le raccourcissement des jours de prĂ©-vacances n'est pas nĂ©cessaire, nous les considĂ©rons comme complets. Étant donnĂ© que les vacances varient d'une annĂ©e Ă  l'autre, c'est-Ă -dire qu'elles sont fixĂ©es par une liste explicite, nous nous limiterons aux dates uniquement de 2018 et 2019. Je suis sĂ»r que, si nĂ©cessaire, la solution peut ĂȘtre facilement complĂ©tĂ©e.

Il est nécessaire d'ajouter une colonne avec la durée en heures de travail aux périodes initiales des périodes . Voici le résultat:

  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 

Nous ne vérifions pas l'exactitude des données initiales; nous considérons toujours start_time <= stop_time .

Les constructions spĂ©ciales de dialecte SQL de PostgreSQL peuvent ĂȘtre utilisĂ©es, mais pas abusĂ©es. Pour une exactitude complĂšte des conditions, j'ajoute que la requĂȘte doit ĂȘtre exĂ©cutĂ©e sur PostgreSQL version 10 ou ultĂ©rieure.

Dans un mois, il y aura une analyse de la tĂąche. Je ne prends aucune dĂ©cision de sorte qu'il y ait une incitation Ă  rĂ©soudre par moi-mĂȘme. Nous vous prions de bien vouloir - placer le code dans les commentaires sous les spoilers!

Dernier point mais non le moindre . Si j'ai dĂ©jĂ  rĂ©ussi Ă  publier cet article sur le blog d'entreprise de Postgres Professional, nous utiliserons des goodies d'entreprise: pour la solution la plus intĂ©ressante Ă  ce problĂšme, nous jouerons un voyage gratuit Ă  PGConf.Russia 2020 . Les critĂšres d'intĂ©rĂȘt seront personnellement les miens, ainsi que ceux des collĂšgues avec lesquels j'estime nĂ©cessaire de consulter. Bonne chance

MISE À JOUR! Quelque chose que je vois que les heures de travail sont perçues pour une raison exclusivement sans minutes de travail. N'oubliez pas les minutes! J'ai ajustĂ© les intervalles initiaux et la rĂ©ponse attendue pour souligner la disponibilitĂ© des minutes.

Résumé UPDATE2 : https://habr.com/en/company/postgrespro/blog/457722/ .

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


All Articles