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

PL/SQL Oracle Discussion :

Comparaison de dates avec to_char()


Sujet :

PL/SQL Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 28
    Points : 11
    Points
    11
    Par défaut Comparaison de dates avec to_char()
    Bonjour,
    J'ai besoin de votre aide pour le script que j'ai ecrit : Il a pour but de supprimer des entree dans une table X. dans la table se trouve un champs datedansX qui permet de dater les entrées.
    Je souhaite supprimer de facon circulaire les entrée de la maniere suivante :

    pour toutes les annees
    pour tous les mois
    pour tous les jours
    faire (
    suppression
    commit
    )

    Mon probleme vient pour le moment de la fonction delete, en effet lors de la comparaison il ne me retourne aucune entrée, à comparer quand je teste la ligne seule :
    DELETE FROM X WHERE TO_CHAR(DATEdansX, 'DD/MM/YYYY') = TO_CHAR(01)||'/'||TO_CHAR(12)||'/'||TO_CHAR(2008);
    alors que l'ecriture suivante supprime les entrées :
    DELETE FROM X WHERE TO_CHAR(DATEdansX, 'DD/MM/YYYY') = '01/12/2008';

    Pouvez vous m'aider à resoudre ce probleme, je pense pour un probleme de digit ou de formatage de la fonction TO_CHAR.

    merci.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Points : 112
    Points
    112
    Par défaut
    Pour moi les deux lignes devraient faire la même chose...
    Donne plutôt ton véritable code qui utilise les variables et non des nombres écrits en dur, parce qu'à mon avis le problème vient plutôt de là!

    Mais pourquoi tu ne fais pas simplement quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM toto WHERE DATEdansX > dateMin AND DATEdansX < dateMax
    ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 28
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par brassouille Voir le message
    Pour moi les deux lignes devraient faire la même chose...
    Donne plutôt ton véritable code qui utilise les variables et non des nombres écrits en dur, parce qu'à mon avis le problème vient plutôt de là!

    Mais pourquoi tu ne fais pas simplement quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM toto WHERE DATEdansX > dateMin AND DATEdansX < dateMax
    ?
    effectivement, je veux comparer 2 dates le plus simplement possible, une des date vient du champ de la table et est de type date et l'autre je la construis à l'aide de nombre. Si il y a plus simple je suis tout ouie :o)

    voila le code entier :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    --DECLARATION DES VARIABLES
    DECLARE
    -- variables de traitement
    Jour number := 1;
    Mois number := 1;
    Annee number := 2000;
    -- date maxi retenue pour l'effacement des données
    JourMax number := 31;
    MoisMax number := 10;
    AnneeMax number := 2006;
     
     
    -- DEBUT DU PROGRAMME 
    BEGIN
       WHILE Annee <= 2010 LOOP -- en cas de probleme sur la date Max, la procedure s'arretera pour Annee >= 2011
          WHILE Mois <= 12 LOOP
    	   WHILE Jour <= 31 LOOP
    	   	-- suppression des evenements du jour
    	   	DELETE FROM toto WHERE TO_CHAR(DATEdansX, 'DD/MM/YYYY') = TO_CHAR(Jour)||'/'||TO_CHAR(Mois)||'/'||TO_CHAR(Annee);
    	   	-- confirmation de la suppression
    	      COMMIT;
    		Jour := Jour+1;
    		EXIT WHEN Annee=AnneeMax AND Mois=MoisMax AND Jour=JourMax;
    		END LOOP;
    	   Jour := 1;
    	   Mois := Mois+1;
    	END LOOP;
    	Mois :=1;
    	Annee := Annee +1;
       END LOOP;
    END;
    /

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 110
    Points : 111
    Points
    111
    Par défaut
    tu as essayé de passer par une variable intermédiaire?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Points : 112
    Points
    112
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM toto WHERE DATEdansX < TO_DATE('20061031', 'YYYYMMDD')
    c'est pas ce que tu veux??
    Il faut que ton champ DATEdansX soit de type date. Et tu peux construire la chaine '20061031' en concaténant des nombres...

    Et je comprends pas pourquoi tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHILE annee < 2010
       EXIT WHEN ANNEE > 2006
    au lieu de
    ???

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 28
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par brassouille Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM toto WHERE DATEdansX < TO_DATE('20061031', 'YYYYMMDD')
    c'est pas ce que tu veux??
    Il faut que ton champ DATEdansX soit de type date. Et tu peux construire la chaine '20061031' en concaténant des nombres...

    Et je comprends pas pourquoi tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHILE annee < 2010
       EXIT WHEN ANNEE > 2006
    au lieu de
    ???
    Pour les années, c'est un restant de test que j'ai fait, je vais le modifier.


    visiblement mon probleme vient effectivement des digits lors des comparaison
    j'ai réécrit ça, c'est pas forcement joli, mais ça marche :
    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
    20
    21
    22
     
    		IF Jour<10 AND Mois<10 THEN 
    	   	   -- suppression des evenements du jour
    	   	   DELETE FROM toto WHERE TO_CHAR(DATEdansToto, 'DD/MM/YYYY') = '0'||TO_CHAR(Jour)||'/'||'0'||TO_CHAR(Mois)||'/'||TO_CHAR(Annee);
    	   	   -- confirmation de la suppression
    	         COMMIT;
    		ELSIF Jour<10  THEN -- juste le jour est inferieur à 10
    	   	   -- suppression des evenements du jour
    	   	   DELETE FROM toto WHERE TO_CHAR(DATEdansToto, 'DD/MM/YYYY') = '0'||TO_CHAR(Jour)||'/'||TO_CHAR(Mois)||'/'||TO_CHAR(Annee);
    	   	   -- confirmation de la suppression
    	         COMMIT;
    		ELSIF Mois<10 THEN -- juste le mois est inferieur à 10
    	   	   -- suppression des evenements du jour
    	   	   DELETE FROM toto WHERE TO_CHAR(DATEdansToto, 'DD/MM/YYYY') = TO_CHAR(Jour)||'/'||'0'||TO_CHAR(Mois)||'/'||TO_CHAR(Annee);
    	   	   -- confirmation de la suppression
    	         COMMIT;
    		ELSE -- jour et mois superieur à 10	
    	   	   -- suppression des evenements du jour
    	   	   DELETE FROM toto WHERE TO_CHAR(DATEdansToto, 'DD/MM/YYYY') = TO_CHAR(Jour)||'/'||TO_CHAR(Mois)||'/'||TO_CHAR(Annee);
    	   	   -- confirmation de la suppression
    	         COMMIT;
    		END IF;

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Points : 112
    Points
    112
    Par défaut
    La requête que je t'ai écrit ne te va pas???

    Et au lieu de tout convertir en string et comparer des strings, tu n'as qu'à tout convertir en date et comparer des dates...

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 77
    Points : 84
    Points
    84
    Par défaut
    Juste pour info, pour moi il est logique que ton premier delete ne fasse rien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select TO_CHAR(01)||'/'||TO_CHAR(12)||'/'||TO_CHAR(2008) from dual
    Le résultat vaut: '1/12/2008'. Si tu compares des chaînes de caractères, de l'autre côté tu as '01/12/2008'. Ces 2 chaînes ne sont pas identiques

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Points : 112
    Points
    112
    Par défaut
    Ouais effectivement, je n'avais pas vu au début mais il s'en est rendu compte
    Mais l'algo est quand même super compliqué alors qu'il me semble qu'il pourrait être remplacé par une seule et unique requête :-/

    Au pire tu peux aussi utiliser to_char(1, '00') qui oblige le 1 à se mettre sur deux chiffres significatifs, donc te renvoie 01.

Discussions similaires

  1. Comparaison de date avec date systeme
    Par Nako_lito dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 28/08/2012, 09h24
  2. [AC-2007] requête SQL comparaison de dates avec IIF
    Par tibofo dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 24/09/2009, 15h30
  3. comparaison de date avec VB6
    Par fred43 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 10/04/2009, 23h29
  4. comparaison 2 dates avec tag struts
    Par mystro7200 dans le forum Struts 1
    Réponses: 13
    Dernier message: 21/11/2008, 16h12
  5. [Oracle 10g] Format Date avec to_char()
    Par shaun_the_sheep dans le forum SQL
    Réponses: 2
    Dernier message: 28/04/2008, 17h53

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