IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement de jobs Discussion :

Calcul de jours ouvrés


Sujet :

Développement de jobs

  1. #1
    Membre à l'essai
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Mai 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Mai 2012
    Messages : 24
    Points : 18
    Points
    18
    Par défaut Calcul de jours ouvrés
    Bonjour, je découvre l'ETL TOS-DI et me trouve rapidement confronté au problème suivant.

    Je dois calculer le nombre de jours ouvrés entre deux dates. Par exemple, entre aujourd'hui 25/05/2012 et le 30/05/2012, j'en compte non pas 6, mais 3 car samedi et dimanche ne sont pas ouvrés, ni lundi de Pentecôte (au delà de l'affaire qui concerne particulièrement ce jour...).

    Pour ce faire, j'ai pour l'instant choisi de construire un calendrier dans une table MySQL, qui, pour chaque jour entre le 1er janvier 2011 et le 31 décembre 2019, indique s'il est chômé ou non, par un booléen.
    La structure des colonnes de la table calendrier est donc :
    Date : string
    Chome : booléen

    Pour calculer le nombre de jours ouvrés entre StartDate et StopDate, qui sont fourni par un input row, j'ai donc besoin de quelque chose qui sache faire l'équivalent d'un SELECT count(*) FROM calendrier WHERE Date BETWEEN StartDate AND StopDate AND NOT Chome;

    Jusqu'à présent je ne m'en sors pas vraiment... aussi un coup de pouce serait le bienvenu, merci !

  2. #2
    Membre averti
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2011
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2011
    Messages : 201
    Points : 352
    Points
    352
    Par défaut
    Un TMap pour filtrer la condition (Chome à vrai ou faux), puis un tAggregateRow, avec un count.

    Bon courage,

  3. #3
    Membre expérimenté Avatar de Benoit_Durand
    Profil pro
    Consultant en Business Intelligence Freelance
    Inscrit en
    Mars 2005
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence Freelance

    Informations forums :
    Inscription : Mars 2005
    Messages : 861
    Points : 1 308
    Points
    1 308
    Par défaut
    J'avais eu le même problème et j'étais passé par une fonction scalaire sql server. Je ne sais pas s'il existe l'équivalant sous mysql.

    je suppose que vous avez un flux d'entrée et que pour chaque ligne de ce flux il vous faut le nombre de jours ouvrés ?

    Je mettrais en lookup du tmap l'appel à la requête mysql que vous avez donnée, avec un rechargement à chaque ligne. Ca fonctionnera bien si la volumétrie est faible sinon ça va ramer. Vous avez une forte volumétrie ?
    Pensez à la fonction Recherche

  4. #4
    Membre à l'essai
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Mai 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Mai 2012
    Messages : 24
    Points : 18
    Points
    18
    Par défaut
    Oups... je pensais recevoir des mails étant abonné au thread... mais rien.

    @NicolasTT : je ne vois pas (encore) la logique...

    @Benoit_Durand : merci, la volumétrie est faible, de quelques centaines de lignes à chaque itération du jobs.

    En fait, j'ai pour le moment pris le parti de continuer à "en mettre le maximum" dans les données. J'ai donc fais évoluer mon calendrier par une colonne cumulant, pour chaque ligne depuis son début, le nombre de jours chômés.

    Date : string
    Chome : booléen
    CumulChome : int

    Extrait :
    2011-01-01 | 1 | 1
    2011-01-02 | 1 | 2
    2011-01-03 | 0 | 2
    2011-01-04 | 0 | 2
    . . .

    Ensuite, pour connaître le nombre de jours chômés entre deux dates, c'est simplement la différence entre le CumulChome de StopDate et celui de StartDate...
    Très simple à coder !

  5. #5
    Membre expérimenté Avatar de Benoit_Durand
    Profil pro
    Consultant en Business Intelligence Freelance
    Inscrit en
    Mars 2005
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence Freelance

    Informations forums :
    Inscription : Mars 2005
    Messages : 861
    Points : 1 308
    Points
    1 308
    Par défaut
    En effet c'est pas mal.
    Pensez à la fonction Recherche

  6. #6
    Membre à l'essai
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Mai 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Mai 2012
    Messages : 24
    Points : 18
    Points
    18
    Par défaut La suite...
    J'ai maintenant un autre problème, qui a toujours trait à ces décomptes de jours ouvrés.

    Il s'agit de déterminer quel sera la date dans N jours ouvrés.

    Par exemple, si N = 3 et que nous sommes vendredi 1er juin 2012, dans 3 jours ouvrés nous serons le mercredi 6 juin (et non pas lundi 4 juin), mais parce que ni lundi, mardi et mercredi ne sont chômés.

    Avec la méthode du décompte de jours chômés entre deux dates (NbJoursChômés) ci-dessus, je ne tiens pas compte des jours chômés qui pourront exister dans les NbJoursChômés suivants (et ceci tant qu'on ne dénombre plus aucun jour chômé dans la nouvelle période de "shift" correspondant à NbJoursChômés).

    En reprenant l'exemple que je donnais juste avant, mais avec mardi 5 juin qui serait férié, j'aurais :
    T0 = 2012-06-01
    Délai = 3j
    T1 = 2012-06-04 et la méthode pour calculer le NbJoursChomés m'indiquerait 2, donc :
    T1' = 2012-06-06

    Il faudrait ré-iterer la méthode pour calculer le NbJoursChômés entre 2012-06-04 et 2012-06-06 pour trouver 1 et donc :
    T1" = 2012-06-07

    Enfin, sachant qu'entre le 7 juin et le 6 juin, il y a 0 jour chômé, on en resterait là.

    Bref, je ne vois pas comment procéder par itération avec TOS, ne sachant pas a priori le nombre d'itérations de calcul de NbJoursChômés...

    Une idée, une piste ?
    Merci !

  7. #7
    Membre expérimenté Avatar de Benoit_Durand
    Profil pro
    Consultant en Business Intelligence Freelance
    Inscrit en
    Mars 2005
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence Freelance

    Informations forums :
    Inscription : Mars 2005
    Messages : 861
    Points : 1 308
    Points
    1 308
    Par défaut
    Ce que je comprend :
    On a une table avec une date et un nombre 0 ou 1 pour chomé :
    maDate | chome
    01/06/2012 | 0
    02/06/2012 | 1
    03/06/2012 | 1
    04/06/2012 | 0
    05/06/2012 | 0
    06/06/2012 | 0

    Une date n'est qu'un entier présenté différemment. Dans la table si vous voulez vous pouvez rajouter un Id incrémental en 3eme colonne.

    getNbChomés(dateA,dateB) : Nombre de jours chomés entre dateA et dateB = SOMME des chome entre dateA et dateB.
    getDateOuvré(dateA,N) : Date dans N jours ouvrés à partir de dateA = dateA + N + getNbChomés(dateA,dateA+N)

    Un système comme celui là ne fonctionnerait pas ?
    Pensez à la fonction Recherche

  8. #8
    Membre à l'essai
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Mai 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Mai 2012
    Messages : 24
    Points : 18
    Points
    18
    Par défaut
    Je ne suis pas certain...

    Prenons cette hypothèse :

    maDate | chome
    01/mm/yyyy | 0
    02/mm/yyyy | 1
    03/mm/yyyy | 1
    04/mm/yyyy | 0
    05/mm/yyyy | 0
    06/mm/yyyy | 1
    07/mm/yyyy | 1
    08/mm/yyyy | 0
    09/mm/yyyy | 1

    T0 = 01/mm/yyyy
    N = 4 jours

    T1 = 04/mm/yyyy auquel on rajoute donc les 2 jours chômés des 02 et 03, soit :
    T1' = 06/mm/yyyy et entre le 04 et le 06, on dénombre 1 jour chômé, donc :
    T1" = 07/mm/yyyy qui est chômé !!

    Ca veut donc dire qu'il faut itérer tant que le nombre de jours chômés entre la nouvelle date calculée et la précédente n'est pas nul.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Mai 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Mai 2012
    Messages : 24
    Points : 18
    Points
    18
    Par défaut Pourtant simple...
    La réponse a été apporté par "paja" sur le forum talendforge.

    Après coup, ça paraît si simple...

    maybe you can try to invert the "nonbusyDay" logic:

    Date | BusyDay | cumulCount
    2011-01-01 | 0 | 0
    2011-01-02 | 0 | 0
    2011-01-03 | 1 | 1
    2011-01-04 | 1 | 2

    date | BusyDay | cumulCount
    yyyy-mm-01 | 1 | 1234
    yyyy-mm-02 | 0 | 1234
    yyyy-mm-03 | 0 | 1234
    yyyy-mm-04 | 1 | 1235
    yyyy-mm-05 | 1 | 1236
    yyyy-mm-06 | 0 | 1236
    yyyy-mm-07 | 0 | 1236
    yyyy-mm-08 | 1 | 1237
    yyyy-mm-09 | 0 | 1237

    Then the cumulCount of the start yyyy-mm-01 is 1234 and the end ist 1237 (delay - 1 -> if the first day counts too)

    I think this is easy to handle with TOS
    Merci ici à Benoit_Durand et NicolasTT.

Discussions similaires

  1. calcul de jours ouvrés entre 2 dates
    Par pinpin_pinpin dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 20/11/2009, 22h24
  2. Calcul de jours ouvrés entre 2 dates
    Par pinpin_pinpin dans le forum Langage SQL
    Réponses: 1
    Dernier message: 20/11/2009, 20h33
  3. [calcul] dernier jour ouvré du mois
    Par xolias dans le forum Oracle
    Réponses: 5
    Dernier message: 26/02/2008, 16h26
  4. Fonction de calcul de jours ouvrés
    Par jeanjean0403 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 03/01/2008, 10h04
  5. Réponses: 3
    Dernier message: 28/09/2007, 11h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo