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
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/ .