Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/04/2008, 14h39   #1
Candidat au titre de Membre du Club
 
Inscription : mars 2003
Messages : 49
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : mars 2003
Messages : 49
Points : 12
Points : 12
Envoyer un message via MSN à glutock
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 :
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 :
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 !
glutock est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 14h43   #2
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 459
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 459
Points : 4 226
Points : 4 226
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
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 14h46   #3
Candidat au titre de Membre du Club
 
Inscription : mars 2003
Messages : 49
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : mars 2003
Messages : 49
Points : 12
Points : 12
Envoyer un message via MSN à glutock
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 ?
glutock est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 14h57   #4
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 459
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 459
Points : 4 226
Points : 4 226
Code :
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
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 15h00   #5
Candidat au titre de Membre du Club
 
Inscription : mars 2003
Messages : 49
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : mars 2003
Messages : 49
Points : 12
Points : 12
Envoyer un message via MSN à glutock
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 !
glutock est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 15h07   #6
Membre éclairé
 
Inscription : décembre 2005
Messages : 315
Détails du profil
Informations personnelles :
Âge : 35
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : décembre 2005
Messages : 315
Points : 313
Points : 313
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.
jproto est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 15h16   #7
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 459
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 459
Points : 4 226
Points : 4 226
Voici la solution qu'il me semble avoir choisi
Code :
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 :
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
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 15h29   #8
Candidat au titre de Membre du Club
 
Inscription : mars 2003
Messages : 49
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : mars 2003
Messages : 49
Points : 12
Points : 12
Envoyer un message via MSN à glutock
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 !
glutock est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2008, 17h24   #9
Membre éprouvé
 
Inscription : septembre 2004
Messages : 465
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 465
Points : 412
Points : 412
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 :
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 :
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 :
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.

++
GoLDoZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2008, 09h14   #10
Membre éclairé
 
Inscription : août 2005
Messages : 316
Détails du profil
Informations personnelles :
Âge : 41

Informations forums :
Inscription : août 2005
Messages : 316
Points : 342
Points : 342
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
c.langlet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2008, 12h04   #11
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 459
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 459
Points : 4 226
Points : 4 226
Tout simplement.

J'ai complètement zappé ce format sur les dates.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2008, 13h12   #12
Membre éclairé
 
Inscription : décembre 2005
Messages : 315
Détails du profil
Informations personnelles :
Âge : 35
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : décembre 2005
Messages : 315
Points : 313
Points : 313
Citation:
Envoyé par McM Voir le message
Tout simplement.

J'ai complètement zappé ce format sur les dates.
+1
Chris.
jproto est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h20.


 
 
 
 
Partenaires

Hébergement Web