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 :

TO_DATE et norme ISO


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 18
    Points : 11
    Points
    11
    Par défaut TO_DATE et norme ISO
    Bonjour,

    J'aimerais obtenir une date à partir d'un numéro de semaine et une année, en norme ISO.
    Malheureusement TO_DATE ne semble pas fonctionner avec les formats standards ISO, qui sont pourtant supportés par TO_CHAR :
    TO_DATE('29-2007','IW-IYYY') renvoie une exception ORA-01820 "format code cannot appear in date input format"

    Quelqu'un aurait-il une idée ?

    Merci

  2. #2
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Il me semble quand meme qu'il faut un jour dans la semaine ?
    Lequel ?

  3. #3
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Faites attention à ce que vous tapez !

    IW-YYYY ou IW-IYYY ?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Bonjour et merci de vos réponses

    @Garuda : l'ajout du jour de la semaine 'D-IW-IYYY' ne change rien, ce sont les ,formats ISO qui ne semblent pas supportés

    @LeoAnderson: IYYY correspond à l'année de la semaine ISO
    Par exemple, le 31 décembre 2007 fait partie de la semaine 1 de 2008 en ISO, pour cette date YYYY renvoie 2007 et IYYY renvoie 2008

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Pour ceux que le problème intéresse voilà comment j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    	   dte_courante := NULL;
       	   dte_tmp := TO_DATE( CONCAT('1/12/',TO_CHAR(p_annee-1)),'DD/MM/YYYY' );
       	   LOOP
    		   IF TO_CHAR(dte_tmp,'D-IW-IYYY') = CONCAT( CONCAT(TO_CHAR(i),CONCAT('-',TO_CHAR(p_semaine))),
    		   	  							   	 		 CONCAT('-',TO_CHAR(p_annee)) ) THEN
    		   	  dte_courante := dte_tmp;
    		   END IF;
       	   	   EXIT WHEN dte_courante IS NOT NULL;
    		   dte_tmp := dte_tmp + 1;
    	   END LOOP;
    Les autres solutions restent bienvenues..

  6. #6
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Attention to_char(p_semaine) si p_semaine < 10 ce sera pas bon (tu auras '-1-' et la comparaison sera fausse.
    Faut faire un LPAD(to_char(p_semaine), 2, '0')

  7. #7
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Tu peux ausi te baser sur ce post
    http://www.developpez.net/forums/sho...hlight=semaine

    Et aussi éviter les CONCAT, préfère les || c'est plus lisible.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Merci.
    On va dire que c'est résolu.

  9. #9
    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
    tu peux écrire IYYY - IW comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    trunc(to_date(:p_annee,'YYYY'),'IYYY')+:p_semaine*7-7

  10. #10
    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 McM
    Et aussi éviter les CONCAT, préfère les || c'est plus lisible.
    oui, mais attention sur certains OS les || et les ¦¦ se confondent. Pour un maximum de portabilité des scripts entre les OS, le concat est préférable

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Bonjour Laurent,

    J'ai le regret de t'annoncer que la solution pour obtenir IW-IYYY n'est pas infaillible :
    En mettant la date de ton ordinateur en janvier,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT TRUNC(TO_DATE(2012,'YYYY'),'IYYY') FROM dual
    ne renvoie pas le premier jour de l'année ISO 2012, mais le premier jour de l'année ISO 2011.

    Je propose donc cette sécurité pour obtenir IW-IYYY:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    trunc(to_date(:p_annee,'YYYY')+15,'IYYY')+:p_semaine*7-7

  12. #12
    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
    excellent! merci pour la correction...

  13. #13
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Citation Envoyé par nguema
    Bonjour Laurent,

    J'ai le regret de t'annoncer que la solution pour obtenir IW-IYYY n'est pas infaillible :
    En mettant la date de ton ordinateur en janvier,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT TRUNC(TO_DATE(2012,'YYYY'),'IYYY') FROM dual
    ne renvoie pas le premier jour de l'année ISO 2012, mais le premier jour de l'année ISO 2011.

    Je propose donc cette sécurité pour obtenir IW-IYYY:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    trunc(to_date(:p_annee,'YYYY')+15,'IYYY')+:p_semaine*7-7
    Je ne suis pas sur d'avoir compris pourquoi il fallait mettre la date de l'ordinateur en janvier (client ou serveur ?) mais
    Chez moi, ca marche :
    test En 8.1.7 sous Toad
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT TRUNC(TO_DATE(2012,'YYYY'),'IYYY') FROM dual
     
    => 02/01/2012

  14. #14
    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
    c'est vrai que to_date(:d,'YYYY') est non-deterministic car ça dépend de sysdate.

    Il serait peut-être plus propre d'employer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    trunc(to_date(:p_annee||'0601','YYYYMMDD')+15,'IYYY')+:p_semaine*7-7
    comme ça on pourrait aussi employer cette fonction d'un index ou une vue matérialisée.

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Je ne suis pas sur d'avoir compris pourquoi il fallait mettre la date de l'ordinateur en janvier (client ou serveur ?)
    Bonjour,
    Je suis aussi en 8.1 sous Toad.
    Chez moi TO_DATE(2012,'YYYY') renvoie le premier jour du mois en cours, de l'année 2012.
    Si je l'exécute aujourd'hui, il renvoie 01/08/2012
    Si je l'exécute en janvier, il renvoie 01/01/2012
    Or le 01/01/2012 fait partie de l'année ISO 2011, d'où le problème.
    Cela n'arrivera jamais avec le 15.

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

Discussions similaires

  1. [ISO] Normes ISO 25000
    Par popek dans le forum Qualité
    Réponses: 0
    Dernier message: 27/04/2009, 22h46
  2. [Imprimante] norme ISO/IEC 24712:2006
    Par looping dans le forum Périphériques
    Réponses: 0
    Dernier message: 17/02/2009, 08h34
  3. Fichier .rub et norme ISO
    Par nakac dans le forum Automation
    Réponses: 0
    Dernier message: 07/05/2008, 10h21
  4. Numéro de la semaine selon la norme ISO
    Par steelidol dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 02/02/2006, 15h05
  5. Recherche norme ISO 3309
    Par genki dans le forum Juridique
    Réponses: 2
    Dernier message: 30/10/2004, 22h34

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