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 :

casse-tête sur date/calendrier


Sujet :

SQL Oracle

  1. #1
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut casse-tête sur date/calendrier
    Bonjour,

    je viens de voir passer une question un peu spéciale...

    le gars saisi un mois (février), un numéro de semaine dans le mois (2) et enfin un jour (lundi) et veut obteniri la date exacte correspondante.
    Un Oraclien fou aurait une idée?

    le problème réside dans le numéro de semaine qui ne correspond pas aux semaines de l'année (52/53) vu que chaque mois pour lui a une semaine n° 1.

  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
    Ca doit être possible, mais si jamais il donne Aout 2007, Semaine 1, Lundi
    La semaine 1 d'aout commence le mercredi, ça doit donner le Lundi 6 egal au lundi de la semaine 2 ?

  3. #3
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Je pense que s'il veut le lundi de la première semaine du mois, il faut donner le lundi du mois sélectionné.

    donc le lundi de la première semaine de février 2007 correspond au 05/02/2007

  4. #4
    Membre expert
    Avatar de bouyao
    Inscrit en
    Janvier 2005
    Messages
    1 778
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 778
    Points : 3 033
    Points
    3 033
    Par défaut
    Lundi de la première semaine de février 2007 correspond bien au 05/02/2007.
    Par contre pour Aout 2007, Semaine 1, Lundi
    La semaine 1 d'aout commence le mercredi et finira le mardi, donc le Lundi 6 est celui de la semaine 1.

  5. #5
    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
    Juste pour info (je suis en train d'essayer de te faire une requete), la semaine commence le Dimanche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    WITH T AS (SELECT TO_DATE('01.04.2007', 'DD.MM.YYYY') + ROWNUM - 1 d
    			FROM fclient
    			WHERE ROWNUM < 30)
    SELECT d, TO_CHAR(d, 'DAY'), TO_CHAR(d, 'W')
    FROM t
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    D	TO_CHAR(D,'DAY')	TO_CHAR(D,'W')
    01/04/2007	SUNDAY   	1
    02/04/2007	MONDAY   	1
    03/04/2007	TUESDAY  	1
    04/04/2007	WEDNESDAY	1
    05/04/2007	THURSDAY 	1
    06/04/2007	FRIDAY   	1
    07/04/2007	SATURDAY 	1
    08/04/2007	SUNDAY   	2
    09/04/2007	MONDAY   	2

  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
    Citation Envoyé par bouyao Voir le message
    Lundi de la première semaine de février 2007 correspond bien au 05/02/2007.
    Par contre pour Aout 2007, Semaine 1, Lundi
    La semaine 1 d'aout commence le mercredi et finira le mardi, donc le Lundi 6 est celui de la semaine 1.
    Non, je ne suis pas du tout d'accord.
    La semaine dans un mois n'est pas glissante.

  7. #7
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Peu importe. Si l'utilisateur demande le lundi de la première semaine de février, l'algo doit donner 05/02/2007 et pas 29/01/2007.

  8. #8
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Pour un NLS French, la semaine commence bien le lundi

  9. #9
    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
    Citation Envoyé par SheikYerbouti Voir le message
    Pour un NLS French, la semaine commence bien le lundi
    Flûte, pas chez moi !! Font chier ces anglais à rien faire comme tout le monde
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT TO_CHAR(TO_DATE('01.04.2007', 'DD.MM.YYYY'), 'DAY') jour,
    		TO_CHAR(TO_DATE('01.04.2007', 'DD.MM.YYYY'), 'DAY', 'NLS_DATE_LANGUAGE=French') AS jour_france,
    		TO_CHAR(TO_DATE('01.04.2007', 'DD.MM.YYYY'), 'W') AS semaine_ang,
    		TO_CHAR(TO_DATE('01.04.2007', 'DD.MM.YYYY'), 'W', 'NLS_DATE_LANGUAGE=French') AS semaine_france
    FROM dual
     
    JOUR	JOUR_FRANCE	SEMAINE_ANG	SEMAINE_FRANCE
    SUNDAY   	DIMANCHE	1	1

  10. #10
    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
    Citation Envoyé par SheikYerbouti Voir le message
    Peu importe. Si l'utilisateur demande le lundi de la première semaine de février, l'algo doit donner 05/02/2007 et pas 29/01/2007.
    Bon, tant pis, j'avais une solution.
    Mias on peut partir de là :
    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
    19
    WITH T AS (SELECT TO_DATE('01.08.2007', 'DD.MM.YYYY') + ROWNUM - 1 d,
    				2 AS nbsem,
    				'Tuesday' AS jour 
    			FROM dual)
    SELECT d, TO_CHAR(d, 'DAY'), TO_CHAR(d, 'D'), 
    		TRUNC(d, 'MM') + 1 - TO_CHAR(TRUNC(d, 'MM'),'D') prem_dimanche_mois, --premier dimanche du mois 
    		TRUNC(d, 'MM') + 1 - TO_CHAR(TRUNC(d, 'MM'),'D') + 7 * (:nbsem -1) AS prem_dimanche_semaine, -- premier dimanche de la semaine
    		NEXT_DAY(TRUNC(d, 'MM') + 1 - TO_CHAR(TRUNC(d, 'MM'),'D') + 7 * (nbsem -1) -1, 'Sunday') AS prochain_dimanche_delasemaine,
    		NEXT_DAY(TRUNC(d, 'MM') + 1 - TO_CHAR(TRUNC(d, 'MM'),'D') + 7 * (nbsem -1) -1, jour) AS prochain_mardi_delasemaine
    FROM t		
     
     
    D				01/08/2007		
    TO_CHAR(D,'DAY')			WEDNESDAY
    TO_CHAR(D,'D')			4
    PREM_DIMANCHE_MOIS		29/07/2007
    PREM_DIMANCHE_SEMAINE		05/08/2007		
    PROCHAIN_DIMANCHE_DELASEMAINE	05/08/2007
    PROCHAIN_MARDI_DELASEMAINE	07/08/2007

  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
    Autre question dans l'autre sens : Pour août 2007
    si on demande semaine 5 (du lundi 27 au vendredi 31) et qu'on demande le samedi.. faut répondre quoi ?

  12. #12
    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 (j'ai pas encore vérifié les fins de mois. en attente de ta réponse au post précédent).

    d = 1er jour du mois.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    WITH T AS (SELECT TRUNC(TO_DATE('01.08.2007', 'DD.MM.YYYY'),'MM') d,
    				2 AS nbsem,
    				'Tuesday' AS jour 
    			FROM dual)
    SELECT NEXT_DAY(
    			GREATEST(d + 7 * (nbsem -1) - TO_NUMBER(TO_CHAR(d, 'D')) + 1, d - 1) --éviter de passer au mois d'avant.
    				, jour)
    FROM t
    next_day renvoie le prochain jour même si c'est le jour même donc obligé de mettre un -1 pour pouvoir l'utiliser.

  13. #13
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    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
     
    Connecté à :
    Oracle9i Enterprise Edition Release 9.2.0.5.0 - 64bit Production
    With the Partitioning, OLAP and Oracle Data Mining options
    JServer Release 9.2.0.5.0 - Production
    SQL> WITH T AS (SELECT TO_DATE('01/08/2007', 'DD/MM/YYYY') d,
      2      2 AS nbsem,
      3      'Tuesday' AS jour 
      4     FROM dual)
      5  SELECT NEXT_DAY(GREATEST(d + 7 * (nbsem -1) - TO_NUMBER(TO_CHAR(d, 'D')) + 1, d) ,jour)
      6  FROM t
      7  /
    SELECT NEXT_DAY(GREATEST(d + 7 * (nbsem -1) - TO_NUMBER(TO_CHAR(d, 'D')) + 1, d) ,jour)
                                                                                      *
    ERREUR à la ligne 5 :
    ORA-01846: not a valid day of the week
     
    SQL>

  14. #14
    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
    ouais, bon, t'es en français

  15. #15
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Effectivement
    sinon, ça fonctionne bien

  16. #16
    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
    Avec des n° de jours comme
    1 = dimanche, 2=lundi...

    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.08.2007', 'DD.MM.YYYY') d,
    		:p_nbsemaine AS nbsem,
    		TO_CHAR(SYSDATE - TO_NUMBER(TO_CHAR(SYSDATE, 'D')) + :p_nojour, 'DAY') AS jour 
    		FROM dual)
    SELECT NEXT_DAY(
    		GREATEST(d + 7 * (nbsem -1) - TO_NUMBER(TO_CHAR(d, 'D')) + 1, d -1) --éviter de passer au mois d'avant.
    		,jour) AS date_trouvee
    FROM t

  17. #17
    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
    Oups, ma doc était incomplète sur le NEXt_DAY.
    Ca prend aussi les N° de jour : Encore plus simple
    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.08.2007', 'DD.MM.YYYY') d,
    		4 AS nbsem,
    		5 AS nojour --1:Dimanche .. 5 = Jeudi.
    	FROM dual)
    SELECT NEXT_DAY(
    		GREATEST(d + 7 * (nbsem -1) - TO_NUMBER(TO_CHAR(d, 'D')) + 1, d -1) --éviter de passer au mois d'avant.
    		, nojour) AS date_trouvee
    FROM t

  18. #18
    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
    Au cas ou, pour info, voici la requête pour renvoyer NULL si le jour n'existe pas dans la semaine du mois.
    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.08.2007', 'DD.MM.YYYY') d, -- premier jour du mois 
    				3 AS nbsem,	-- N° de la semaine.
    				1 AS jour  -- N° du jour (1:dimanche .. 5:Jeudi .. 7:Samedi ) 
    			FROM dual),
    j AS (SELECT d,	NEXT_DAY(TRUNC(d, 'MM') + 1 - TO_CHAR(TRUNC(d, 'MM'),'D') + 7 * (nbsem -1) -1, jour) AS jour_trouve
    FROM t)
    SELECT DECODE(TRUNC(jour_trouve, 'MM'), d, jour_trouve, NULL) AS retour -- Si jour n'est pas dans le mois, on renvoie null.
    FROM j
    Attention : Par contre dans tous ces cas, la semaine commence le dimanche.

  19. #19
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut

  20. #20
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    ça fait pas long feu les casse-têtes sur ce forum

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Vxi3] Casse-tête sur compteurs
    Par gillou13 dans le forum Designer
    Réponses: 8
    Dernier message: 15/04/2011, 15h21
  2. fonction casse-tête sur une date
    Par clavier12AZQSWX dans le forum Langage SQL
    Réponses: 1
    Dernier message: 12/06/2009, 11h36
  3. Requête casse tête sur anniversaire
    Par fardon57 dans le forum SQL
    Réponses: 3
    Dernier message: 14/01/2009, 16h53
  4. Casse tête sur du friend avec de l'héritage
    Par Drannor dans le forum C++
    Réponses: 4
    Dernier message: 03/10/2007, 22h20
  5. casse-tête sur les adresses (classe C et A)
    Par HuZimA dans le forum Protocoles
    Réponses: 7
    Dernier message: 27/07/2006, 13h05

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