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

SQL Oracle Discussion :

ADD_MONTHS sur le dernier jour d'un mois de 30 jours


Sujet :

SQL Oracle

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut ADD_MONTHS sur le dernier jour d'un mois de 30 jours
    Bonjour,

    J'utilise ADD_MONTHS dans un traitement pour ajouter des mois.
    J'ai un soucis sur certaines valeurs, quand il s'agit d'ajouter un nombre de mois pair sur une date représentant la fin de mois d'un mois de 30 jours.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select add_months(to_date('30092014','ddmmyyyy'),4) from dual;
    => 31/01/2015
    Or le métier voudrait 30/01/2015.
    Je suppose qu'Oracle imagine que puisque le 30 septembre est le dernier jour du mois, qu'il faut retourner le dernier jour du mois.
    Mais comme ce n'est pas ce qu'ils veulent, je me demande s'il n'existe pas une option ou une méthode pour répondre à ce besoin ?

    Merci de votre aide

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par Hobbi1 Voir le message
    ...
    Je suppose qu'Oracle imagine que puisque le 30 septembre est le dernier jour du mois, qu'il faut retourner le dernier jour du mois.
    ...
    Oui, c'est precisé dans la doc
    If date is the last day of the month or if the resulting month has fewer days than the day component of date, then the result is the last day of the resulting month. Otherwise, the result has the same day component as date.

    Mais comme ce n'est pas ce qu'ils veulent, je me demande s'il n'existe pas une option ou une méthode pour répondre à ce besoin ?
    Le problème est qu'il faut définir le besoin. Pour votre exemple vous pouvez ajouter 30 (jours) à la date mais quelle est la règle complète de gestion ?

  3. #3
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut
    Merci

    Oui le problème se situe donc bien au niveau de la règle de gestion définie. Il est juste précisé "date + colonne (représentant un nombre de mois)"
    Donc je vais me faire précisé ça.

    Pour info, les personnes m'ayant remonté le soucis vérifient sous Excel en utilisant MOIS.DECALER. Et cette fonction d'Excel fait bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MOIS.DECALER('30/09/2014';4) => 30/01/2015

  4. #4
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Excel, Oracle, Java: chacun a son propre algorithme. Mais fonctionnellement le calcul d'un délai peut être complexe, voir un exemple sur les marchés publics
    Les délais sont toujours calculés en jours "francs"
    ◾ Le jour au cours duquel s’effectue l’acte n’est pas compté dans le délai
    ◾ Le délai commence à courir au début de la première heure du premier jour qui suit l’acte ("dies a quo")
    ◾ Le décompte s’effectue sur tous les jours calendaires (un jour = 0 heure à minuit)
    ◾ Le délai calendaire est un délai qui inclut les jours férié, les samedis et dimanches. Les jours calendaires correspondent donc au calendrier, soit sept jours par semaine et non pas les cinq jours ouvrés par semaine - Référence : JORF n°0303 du 31 décembre 2009 page 23171 texte n° 90 Annotation (85)
    ◾ Le délai prend fin à l’expiration de la dernière heure du dernier jour
    ◾ Si le dernier jour tombe un samedi, dimanche ou jour férié, le délai prend fin à l’expiration de la dernière heure du jour ouvrable suivant.

  5. #5
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut
    Merci pour ces précisions.
    C'est vrai que les calculs de date, les délais sont toujours source de problématiques.

    La balle est désormais dans les mains des gens du métier qui doivent trancher.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/09/2006, 17h22
  2. Réponses: 26
    Dernier message: 01/07/2006, 13h14
  3. question sur 6 jours ouvrés par mois de préavis du syntec
    Par Filippo dans le forum Droit du travail
    Réponses: 21
    Dernier message: 14/06/2006, 13h20
  4. dernier jour d'un mois comme oracle
    Par looc 6699 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 07/11/2005, 11h09
  5. Comment connaître le dernier jour d'un mois donné ?
    Par Le Pharaon dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 11/07/2005, 10h48

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