Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels 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 06/01/2007, 12h41   #1
Invité de passage
 
Inscription : avril 2005
Messages : 10
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 10
Points : 1
Points : 1
Par défaut [oracle] obtenir numero du mois à partir d'un numero de semaine

je sais que c'est pas trés clair
mais j'ai besoin de savoir comment obtenir le numero de mois à partir
du numéro semaine

j'ai une table qui contient le numéro de l'année(ex: 2000), le numéro de semaine(ex: 1-53) et le numéro de jour dans le mois(ex: 1-31)

ma table ne contient pas de numero de mois(ex: 1-12) et je voudrais a terme pouvoir créer des dates mais sans le numero de mois c'est un peu compliqué

me demander pas pourquoi j'ai pas de numero de mois...
c'est imposé :\

merci pour tous ceux qui se seront donner la peine de lire mes anêries
bebone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2007, 16h38   #2
Membre émérite
 
Avatar de Yorglaa
 
Inscription : janvier 2004
Messages : 845
Détails du profil
Informations personnelles :
Âge : 41
Localisation : Suisse

Informations forums :
Inscription : janvier 2004
Messages : 845
Points : 939
Points : 939
Salut,
va voir cette discussion
[Résolu] Numero de semaine -> date debut, date fin
qui donne une solution pour récupérer les dates de début et de fin d'une semaine selon son année et son No.

plus précisément ce Select :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT 
        greatest(trunc(to_date(y||'-01-01','RRRR-MM-DD'),'IW')+(
                                                                Case When
                                                                        trim(to_char(to_date(y||'-01-01','RRRR-MM-DD'),'Day','nls_date_language=french')) NOT IN ('Samedi', 'Dimanche')
                                                                     Then
                                                                        w
                                                                     Else 
                                                                        w +1
                                                                End -1)*7,trunc(to_date(y||'-01-01','RRRR-MM-DD'),'IW')) AS "Lundi"
        , trunc(to_date(y||'-01-01','RRRR-MM-DD'),'IW')+6+(
                                                            Case When
                                                                    trim(to_char(to_date(y||'-01-01','RRRR-MM-DD'),'Day','nls_date_language=french')) NOT IN ('Samedi', 'Dimanche')
                                                                 Then
                                                                    w
                                                                 Else 
                                                                    w +1
                                                            End -1)*7                                                   AS "Dimanche" 
FROM 
        (SELECT &year y, &week w FROM dual) ;
à partir de cette information, tu pourras facilement extraire la partie de la date qui t'intéresse...
__________________
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

Yorglaa
Yorglaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2007, 17h50   #3
Invité de passage
 
Inscription : avril 2005
Messages : 10
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 10
Points : 1
Points : 1
merci
mais c'est du charabia ton truc

j'ai jamais vu de tel instruction dans un select
vais essayer de comprendre mnt
bebone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2007, 14h31   #4
Membre émérite
 
Avatar de Yorglaa
 
Inscription : janvier 2004
Messages : 845
Détails du profil
Informations personnelles :
Âge : 41
Localisation : Suisse

Informations forums :
Inscription : janvier 2004
Messages : 845
Points : 939
Points : 939
Salut,
alors voici l'explication (accroche-toi, c'est pas évident à formuler comme ça) :

En premier lieux il y a 2 paramètres dans ce select, situés ici :
Code :
1
2
FROM 
        (SELECT &year y, &week w FROM dual);
- &year où tu donnes l'année à traiter
- &week où tu donnes le no de semaine à traiter


partant de ça, pour trouver le premier jour (le lundi), on fait :
d'abord on ramène le premier jour de la semaine (fonction trunc avec le format 'IW') qui contient le 1er janvier de l'année voulue
Code :
trunc(to_date(y||'-01-01','RRRR-MM-DD'),'IW')
puis on AJOUTE 7 x (pour 7 jours => donc 1 semaine) le no de la semaine voulue OU le no de la semaine PLUS 1, dépendant si l'année à commencé un samedi ou dimanche (la semaine 1 est la première semaine qui contient un lundi, un CASE WHEN est à lire comme un IF).
Code :
1
2
3
4
5
6
7
Case When
        trim(to_char(to_date(y||'-01-01','RRRR-MM-DD'),'Day','nls_date_language=french')) NOT IN ('Samedi', 'Dimanche')
     Then
        w
     Else 
        w +1
End -1)*7
et finalement on va chercher la date la plus grande (fonction greatest) entre le calcul ci-dessus et le premier jour de la semaine du 1er janvier (pour le cas où on traite la semaine 1 et que le lundi soit encore l'année précédente)
Code :
1
2
3
4
greatest(
                ...tout le calcul précédent...
                ,trunc(to_date(y||'-01-01','RRRR-MM-DD'),'IW')
        ) AS "Lundi"
Pour le Dimanche le principe est quasiment identique :
d'abord on ramène le premier jour de la semaine + 6 (fonction trunc avec le format 'IW') qui contient le 1er janvier de l'année voulue pour arriver au dimanche
Code :
trunc(to_date(y||'-01-01','RRRR-MM-DD'),'IW') + 6
auquel on ajoute également 7 x le no de la semaine ou le no de la semaine + 1, selon que le 1er janvier ait été un samedi ou un dimanche ou non (calcul identique à précédement).

voilà, c'est tout... j'espère que ça t'aidera...
__________________
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

Yorglaa
Yorglaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2007, 16h47   #5
Membre éclairé
 
Inscription : décembre 2004
Messages : 349
Détails du profil
Informations personnelles :
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2004
Messages : 349
Points : 367
Points : 367
... et pourquoi pas simplement :

Code :
1
2
SELECT TO_char ( to_date('01/01/2007','DD/MM/RRRR')+ ((&semaine-1) *7),'MM' ) 
FROM dual

CDLT.
taska est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2007, 19h18   #6
Membre émérite
 
Avatar de Yorglaa
 
Inscription : janvier 2004
Messages : 845
Détails du profil
Informations personnelles :
Âge : 41
Localisation : Suisse

Informations forums :
Inscription : janvier 2004
Messages : 845
Points : 939
Points : 939
salut,
va voir le Post que je mentionne dans le 2ème message...
c'est nettement plus développé.
__________________
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

Yorglaa
Yorglaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2007, 22h30   #7
Invité de passage
 
Inscription : avril 2005
Messages : 10
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 10
Points : 1
Points : 1
merci infiniment pour m'avoir aider
bebone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2007, 08h44   #8
Membre émérite
 
Avatar de Yorglaa
 
Inscription : janvier 2004
Messages : 845
Détails du profil
Informations personnelles :
Âge : 41
Localisation : Suisse

Informations forums :
Inscription : janvier 2004
Messages : 845
Points : 939
Points : 939
@taska
de plus, avec ton Select, comment gères-tu les semaines qui chevauchent deux mois (semaine 5 => lundi 29.01.2007 / dimanche 04.02.2007) ?
__________________
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

Yorglaa
Yorglaa 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 00h24.


 
 
 
 
Partenaires

Hébergement Web