0
votes

Comment résumer les congés sans jours fériés?

Salut tous (avant les vacances).

Dans ce cas, j'ai ajouté de nouveaux congés dans ce tableau: P>

SELECT leave.ID_LEAVE, leave.ID_WORKER, workers.FNAME, workers.LNAME, leave.BEGIN_DATE, leave.END_DATE,  
FROM 
(SELECT ADDDATE('1970-01-01', t4 * 10000 + t3 * 1000 + t2 * 100 + t1 * 10 + t0) AS date_value 
 FROM 
(SELECT 0 t0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t0, 
 (SELECT 0 t1 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t1, 
 (SELECT 0 t2 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t2, 
 (SELECT 0 t3 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t3, 
 (SELECT 0 t4 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t4) calendar 
INNER JOIN leave ON calendar.date_value BETWEEN DATE(leave.BEGIN_DATE) AND DATE(leave.END_DATE) 
INNER JOIN workers ON leave.ID_WORKER = workers.ID_WORKER 
WHERE NOT WEEKDAY(date_value) IN (5, 6)
GROUP BY ID_LEAVE;


8 commentaires

Pour commencer, vous devez créer une nouvelle table Calendar qui contient les dates de congé officielles. Une fois que vous avez cela, toute question que vous avez à l'esprit serait relativement simple.


Ce serait beaucoup plus facile si vous êtes prêt à ajouter une table réelle avec une ligne par jour et que vous avez quelque chose sur cette ligne pour marquer si la journée est une fête publique, etc. Vous êtes prêt à faire cela?


Je pense que l'ajout de la nouvelle table de calendrier serait plus facile, mais comment considérez-vous ce jour-là dans la requête après avoir ajouté une table «Vacances»?


Une table séparée pour toutes les dates n'est pas nécessaire, du moins pas dans MySQL 8.0 (étant donné qu'il prend désormais en charge CTES récursif ). Ainsi, op, quelle version mysql?


@Amadan True, mais cela rend les choses beaucoup plus faciles et que la plupart des dbas que j'ai travaillé avec préconisés en utilisant un espace de stockage minimal, sont faciles à calculer comme une seule fois et peuvent être plus optimaux que la génération de données. à la volée chaque fois qu'une requête est courante


@Amadan j'ai 10.1.37-mariadb


@Caiusjard: Je ne suis pas convaincu sans référence, et même alors je ne me dérangerais pas à moins que ce n'était un goulot d'étranglement. Postgretsql generate_series est super pratique, comme est MariDB's's Tables de séquence virtuelle .


Salut @ prochu1991. Si je ne me trompe pas, c'est quelque chose comme un logiciel de fréquentation temporelle que vous essayez de faire, correct? Et vous êtes préoccupé par la mise à jour des vacances une fois que vous avez créé une table de calendrier, est-ce?


3 Réponses :


0
votes

Si vous avez une table de calendrier qui répertorie tous les jours (pas seulement des vacances, mais tous les jours de l'année pour les x prochaines années, et une colonne de la journée est une fête publique, etc.), votre requête ressemble à < Pré> XXX

Il y a beaucoup plus de complexité que vous pouvez ajouter, mais c'est le noyau. Je ne sais pas pourquoi vos feuilles commencent à 7h du matin et finissent à 22 heures, mais vous voudrez peut-être ajouter une certaine logique si vous autorisez des jours fractionnaires éteints - prolongez la date de début à minuit (donc entre les travaux correctement), utilisez donc un cas pour Construire dans la fraction en fonction de si la date à laquelle l'on considère est une date de début ou de fin ou de date d'intervalle


4 commentaires

C'est une idée assez terrible. Vous n'en avez pas besoin. Juste une entrée pour chaque jour qui fait des vacances et une jointure.


N'hésitez pas à soumettre votre propre réponse plutôt que d'être rien qu'un critique des autres. Tout va-t-il d'être utile pour les personnes qui posent des questions; attaquer des personnes qui postaient des réponses avec des revendications injustifiées telles que "c'est une idée terrible" est utile pour personne


Je pensais que sur la table Inner Join 'Holidays' mais, d'autre part, qu'en est-il de sur calendar.date_value ?


Votre table de vacances contient uniquement des vacances. Vous avez toujours besoin de quelque chose pour développer votre date à gamme dans N lignes afin que vous puissiez les compter. Je préconise que votre table de calendrier "une rangée par jour" est-ce que cela (vous avez utilisé un grand nombre de syndicats pour obtenir la même chose, mais cela a fait de votre requête un peu plus difficile à lire et à maintenir



0
votes

variante sans table calendaire à part entière, mais avec une table de vacances comme dans la question (bien que des dates complètes - vous devez le remplir pour chaque année): xxx

Remarque: SEQ_0_TO_24836 est une extension de MariADB uniquement et générera ici toutes les dates de l'époque jusqu'à la fin de 2037.


0 commentaires

0
votes

OK Après avoir analysé tous les commentaires et réponse J'ai trouvé cette solution:

1) J'ai créé la table de vacances.

2) J'ai créé cette requête qui sélectionne tout et résume Devis_Time sans week-end sans week-end sans week-end et vacances: xxx

Je viens de tester ci-dessous des liens:

https://dbfiddle.uk/?rdbms=mariadb_10.3&fiddle=A25A3DC5762F12FC024

a des avertissements à ce sujet? Thx beaucoup et avoir une belle Pâques;)


0 commentaires