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 :

problème de dates avec + INTERVAL & 'year'


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 105
    Points : 116
    Points
    116
    Par défaut problème de dates avec + INTERVAL & 'year'
    Bonjour,

    j'ai un 'petit' problème avec l'interval par année : en effet ça fonctionne mais quand sur la table on tombe sur des dates précises ...ça fait une erreur : ORA-01839: le quantième n'est pas valide pour le mois indiqué

    Hors j'avais cru trouver un truc mais il marche que pour le 29 février : malgré cette trouvaille j'arrive quand même à la même erreur sur d'autres critères de sélection de la table : date non découverte.


    (ps : la solution retenue est d'ajouter en nb jours mais je trouve dommage car c'est moins exact)

    Exemple dual. le 29 février 2008 + 3 ans => erreur : +8 ans ça existe: j'utilise l'astuce d'enlever 1 jour au 29 février 2008 , j'ajoute 3 ans puis le jour supprimé auparavant: l'erreur disparait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    SQL> select to_date('29/02/2008','DD/MM/YYYY') + INTERVAL '3' year from dual;
                                              *
    ERREUR … la ligne 1 :
    ORA-01839: le quantiŠme n'est pas valide pour le mois indiqu‚'
     
    SQL> c/'3'/'8'
      1* select to_date('29/02/2008','DD/MM/YYYY') + INTERVAL '8' year from dual
    SQL> /
     
    TO_DATE(
    --------
    29/02/16
     
    SQL>   1* select to_date('29/02/2008','DD/MM/YYYY')-1 + INTERVAL '3' year +1 from dual;
     
    TO_DATE(
    --------
    01/03/11
    N'y a t'il pas une manière de gérer l'ajout d'intervalle en années qui ne bloque pas sur des dates précises?? je ne voyais que le 29/02 mais ils semblerait qu'il y ait d'autres problèmes.

    Merci d'avance.
    LCA

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 391
    Points
    18 391
    Par défaut
    Oui c'est malheureusement une grosse faiblesse d'INTERVAL aujourd'hui.
    Il vaut mieux se fier à ADD_MONTHS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT
        nb_annee,
        add_months(to_date('29/02/2008','dd/mm/yyyy'), nb_annee * 12) as new_date
    from
    (
    select 0 as nb_annee from dual union all
    select 3 from dual union all
    select 8 from dual
    )
     
    NB_ANNEE	NEW_DATE
    0		29/02/2008
    3		28/02/2011
    8		29/02/2016

  3. #3
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Oui c'est malheureusement une grosse faiblesse d'INTERVAL aujourd'hui.
    Je vais sans doute paraître chiant, mais à mon avis ce n'est pas une faiblesse ;-)

    ADD_MONTHS est une fonction bien propriétaire qui ne convient pas forcément pour calculer les années. Ainsi le 28-Févr.-2009 + 36 mois tombe sur un 29 février. Je ne dis pas que ADD_MONTHS est faux, juste, bon ou mauvais, je dis qu'il correspond à un cas particulier, tel qu'il est défini dans la doc.

    Si tu ajoutes un an à janvier 2000, tu obtiens février 2000. Pas de problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select to_char(to_date('01.2001','MM.YYYY') + interval '1' year,'MM.YYYY') 
    from dual
    TO_CHAR
    --------
    01.2002
    Par contre ajouter 1 an au 29 février 2008, c'est pas possible.

    Tu ne peux pas mélanger des mois et des jours, c'est comme ajouter des pommes et des oranges.

    En outre, l'opération + avec des dates et intervales n'est pas vraiment l'additition car non associative ;-)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SQL> SELECT INTERVAL '4' DAY + (DATE '1999-12-28' + INTERVAL '2' MONTH)
      FROM DUAL
     
    INTERVAL4
    ----------
    2000-03-03
     
     
    SQL> SELECT ( INTERVAL '4' DAY + DATE '1999-12-28') + INTERVAL '2' MONTH
      FROM DUAL
     
    (INTERVAL
    ----------
    2000-03-01
    Pour ajouter 1 an au 29 février, il faut vraiment savoir ce que l'on veut. Un peu de recherche et tu verras que la réponse n'est pas si simple et différe d'une entreprise/d'un pays à l'autre

Discussions similaires

  1. [C#] Problème de Date avec Access
    Par k2vin dans le forum Accès aux données
    Réponses: 4
    Dernier message: 12/12/2006, 15h57
  2. Problème de date avec JAVA & Oracle
    Par bobic dans le forum JDBC
    Réponses: 2
    Dernier message: 02/11/2006, 12h21
  3. [FPDF] Problème de date avec fdpf
    Par axel-erator dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 18/05/2006, 23h05
  4. Problème de date avec un trigger PL/SQL
    Par fluec-wa dans le forum PL/SQL
    Réponses: 6
    Dernier message: 18/01/2006, 14h56
  5. Encore un probléme de date avec TADO !
    Par bNoureddine dans le forum Bases de données
    Réponses: 2
    Dernier message: 22/02/2004, 18h22

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