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 :

Semaine 200701 pour le 31/12/2007


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club Avatar de glutock
    Inscrit en
    Mars 2003
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2003
    Messages : 55
    Points : 37
    Points
    37
    Par défaut Semaine 200701 pour le 31/12/2007
    Bonjour,

    J'ai un petit problème sous Oracle 9.2.

    Lorsque j'exécute cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT TO_CHAR( TO_DATE('30/12/2007', 'DD/MM/YYYY'), 'YYYYIW') FROM DUAL
    Oracle me retourne 200752, ce qui est correct.
    En revanche, lorsque j'exécute celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT TO_CHAR( TO_DATE('31/12/2007', 'DD/MM/YYYY'), 'YYYYIW') FROM DUAL
    Il me retourne 200701 ! Et là je ne comprends pas ... Il me dirait 200753 ou à la rigueur 200801 je serais d'accord mais là je ne vois pas pourquoi 200701 ...

    Si quelqu'un a une explication, je l'en remercie d'avance !

  2. #2
    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
    Parce que la semaine IW est la semaine ISO.
    La semaine 1 de 2008 commence le lundi 31/12/2007

    Donc YYYY = 2007
    IW = 01

    Je me suis aussi fais avoir ;-)
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    Nouveau membre du Club Avatar de glutock
    Inscrit en
    Mars 2003
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2003
    Messages : 55
    Points : 37
    Points
    37
    Par défaut
    Arf ... effectivement, y'avais une finte ...

    Y a-t-il un moyen de contourner ça pour obtenir 200753 ? ou faut-il créer sa propre fonction ?

  4. #4
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT TO_CHAR( TO_DATE('31/12/2007', 'DD/MM/YYYY'), 'YYYYWW') 
    FROM DUAL
     
    200753
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  5. #5
    Nouveau membre du Club Avatar de glutock
    Inscrit en
    Mars 2003
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2003
    Messages : 55
    Points : 37
    Points
    37
    Par défaut
    Et oui je suis bien d'accord avec ça, mais du coup si je fais ça pour 2008, il me fait commencer les semaines au mardi, et moi je veux qu'elles démarrent au lundi !

  6. #6
    Membre averti

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Points : 371
    Points
    371
    Par défaut
    A ma connaissance, la semaine 53 n'existe pas en 2007.

    La rupture de n° de semaine (pour déterminer la semaine n° 1) se réalise vis à vis de la première semaine contenant le mercredi.
    Donc les derniers jours (2 au plus) de l'année peuvent effectivement tomber en semaine 1.

    Chris.

  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
    Voici la solution qu'il me semble avoir choisi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    WITH t AS (SELECT TO_DATE('29.12.2007', 'DD.MM.RRRR') + ROWNUM AS dte FROM fclient WHERE ROWNUM < 10)
    SELECT dte, TO_CHAR(dte, 'IW') IW, TO_CHAR(dte, 'WW') WW, 
    TO_CHAR(dte, 'RRRR') || GREATEST(TO_CHAR(dte, 'IW'), TO_CHAR(dte, 'WW')) AS CONCAT, TO_CHAR(dte, 'DAY')
    FROM t
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DTE		IW	WW	CONCAT	TO_CHAR(DTE,'DAY')
    30/12/2007	52	52	200752	SUNDAY   
    31/12/2007	01	53	200753	MONDAY   
    01/01/2008	01	01	200801	TUESDAY  
    02/01/2008	01	01	200801	WEDNESDAY
    03/01/2008	01	01	200801	THURSDAY 
    04/01/2008	01	01	200801	FRIDAY   
    05/01/2008	01	01	200801	SATURDAY 
    06/01/2008	01	01	200801	SUNDAY   
    07/01/2008	02	01	200802	MONDAY
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  8. #8
    Nouveau membre du Club Avatar de glutock
    Inscrit en
    Mars 2003
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2003
    Messages : 55
    Points : 37
    Points
    37
    Par défaut
    Ok merci, j'ai utilisé ce qu'il me fallait dans la requête et ça a l'air de tourner comme il faut !

    Encore merci !

  9. #9
    Membre confirmé

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Points : 503
    Points
    503
    Par défaut
    Bonjour.

    Ayant été confronté au problème, je vous soumets une solution qui fonctionne.

    Celle proposée ci-dessus ne fonctionne pas pour tous les cas. Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    WITH t AS (SELECT TO_DATE('01.01.2010', 'DD.MM.RRRR') AS dte FROM dual)
    SELECT dte, TO_CHAR(dte, 'IW') IW, TO_CHAR(dte, 'WW') WW, 
    TO_CHAR(dte, 'RRRR') || GREATEST(TO_CHAR(dte, 'IW'), TO_CHAR(dte, 'WW')) AS CONCAT, TO_CHAR(dte, 'DAY')
    FROM t;
    
    DTE                 IW WW CONCAT TO_CHAR(
    ------------------- -- -- ------ --------
    01/01/2010 00:00:00 53 01 201053 VENDREDI
    Le problème du format IW se pose uniquement mais systématiquement pour les premiers et les derniers jours de l'année.
    Il n'y a pas toujours 53 semaines dans une année, on a donc 2 soucis: d'une part, les derniers jours de l'année appartiennent parfois à la semaine 1 de l'année suivante, d'autre part, les premiers jours appertiennent parfois à la semaine 53 de l'année précédente.

    Je n'ai pas trouvé d'autre solution que de traiter ces 2 cas particuliers.
    Voici une requête qui fonctionne à tous les coups, avec 2 exemples critiques:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    WITH t AS (SELECT TO_DATE('01.01.2010', 'DD.MM.RRRR') AS dte FROM dual)
    SELECT DECODE(to_char(dte,'IW'),
      '01',DECODE(to_char(dte,'MM'),'12',to_char(add_months(dte,12),'RRRR'),to_char(dte,'RRRR')),
       '53',DECODE(to_char(dte,'MM'),'01',to_char(add_months(dte,-12),'RRRR'),to_char(dte,'RRRR')),
       to_char(dte,'RRRR'))
    ||to_char(dte,'-IW') SEMAINE
    FROM t;
     
    SEMAINE
    -------
    2009-53
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    WITH t AS (SELECT TO_DATE('31.12.2008', 'DD.MM.RRRR') AS dte FROM dual)
    SELECT DECODE(to_char(dte,'IW'),
       '01',DECODE(to_char(dte,'MM'),'12',to_char(add_months(dte,12),'RRRR'),to_char(dte,'RRRR')),
       '53',DECODE(to_char(dte,'MM'),'01',to_char(add_months(dte,-12),'RRRR'),to_char(dte,'RRRR')),
       to_char(dte,'RRRR'))
    ||to_char(dte,'-IW') SEMAINE
    FROM t;
     
    SEMAINE
    -------
    2009-01
    Pour une fois que je peux rendre service à ce si précieux site, j'en profite.

    ++

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 316
    Points : 388
    Points
    388
    Par défaut
    J'ai peut-être rien compris mais
    en utilisant IYYY au lieu de YYYY on a bien l'année
    ISO dons IW/IYYY nous donne bien le numeros de semaine ISO

  11. #11
    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
    Tout simplement.

    J'ai complètement zappé ce format sur les dates.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  12. #12
    Membre averti

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Points : 371
    Points
    371
    Par défaut
    Citation Envoyé par McM Voir le message
    Tout simplement.

    J'ai complètement zappé ce format sur les dates.
    +1
    Chris.

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

Discussions similaires

  1. Fichier manquants pour TCOMPort installation BCB 2007
    Par antoinelac dans le forum C++Builder
    Réponses: 3
    Dernier message: 31/03/2009, 20h53
  2. Importation de données pour migration sur Access 2007
    Par julius26 dans le forum Modélisation
    Réponses: 4
    Dernier message: 30/03/2009, 18h04
  3. Correctif Avril 2008 pour CodeGear RAD Studio 2007
    Par delphichem dans le forum EDI
    Réponses: 0
    Dernier message: 19/04/2008, 12h17
  4. Macro pour verrouiller dévérrouiller Word 2007
    Par clodius46 dans le forum VBA Word
    Réponses: 4
    Dernier message: 06/11/2007, 22h56
  5. Votre vote pour les élections présidentielles 2007 ?
    Par hegros dans le forum Politique
    Réponses: 615
    Dernier message: 29/04/2007, 21h24

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