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 :

Comparaison de date, l'une étant créée à partir d'une chaine de caractères


Sujet :

SQL Oracle

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut Comparaison de date, l'une étant créée à partir d'une chaine de caractères
    Bonjour à tous,

    Je rencontre un problème pour comparer deux dates dans une requête SQL.

    Ma première date est formée à partir d'un champs qui est une chaine de caractère, de laquelle j'extrais la date.
    Je cherche à la comparer à 'sysdate', mais j'obtiens une erreur : "a non numeric character was found where a numeric was expected".

    Je vais utiliser un exemple pour plus de clarté.

    La table "matable" contient un champs "savetime", de type VARCHAR(50), duquel j'extrais la date :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT TO_DATE(SUBSTR(savetime,15,2) || '/' || SUBSTR(savetime,12,2) || '/2008','dd/mm/yyyy') AS test 
    FROM matable
    Je me retrouve avec un champs "test", dont les valeurs ressemblent à ça : "06/08/2008".

    Je cherche ensuite à comparer cette liste de valeurs avec SYSDATE, en ne conservant que les dates antérieures à aujourd'hui :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT test 
    FROM (
            SELECT TO_DATE(SUBSTR(savetime,5,2) || '/' || SUBSTR(savetime,2,2) || '/2008','dd/mm/yyyy') AS test 
            FROM matable
    )
    WHERE test < trunc(SYSDATE,'dd')
    J'obtiens l'erreur "a non numeric character was found where a numeric was expected".

    J'ai bien essayé des multiples combinaisons de to_date, to_char ou encore trunc un peu partout, rien ne marche.

    Par contre, si j'applique un 'distinct' à ma sous requête, ça passe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT test 
    FROM (
            SELECT DISTINCT to_date(substr(savetime,5,2) || '/' || substr(savetime,2,2) || '/2008','dd/mm/yyyy') AS test 
            FROM matable
    )
    WHERE test < trunc(SYSDATE,'dd')
    J'obtiens bien les valeurs distinctes de ma table dont la date est inférieure à aujourd'hui... mais ça n'est pas ce que je veux.

    Je n'ai plus vraiment d'idée, et je suis bloqué.
    Merci d'avance pour votre aide.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Que veux-tu explicitement ?

    Et ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM matable WHERE to_date(substr(savetime,5,2) || '/' || substr(savetime,2,2) || '/2008','dd/mm/yyyy') < trunc(SYSDATE,'dd')

  3. #3
    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
    J'ai pensé au NULL éliminé par le DISTINCT, mais sur ma base ça bloque.
    Essaye quand même, de vérifier si les SUBSTR ramènent bien des nombres.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Citation Envoyé par Jerome_Mtl Voir le message
    Que veux-tu explicitement ?

    Et ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM matable WHERE to_date(substr(savetime,5,2) || '/' || substr(savetime,2,2) || '/2008','dd/mm/yyyy') < trunc(SYSDATE,'dd')
    Ca ne marche pas non plus, même erreur.

    Ce que je veux explicitement?
    J'ai une table avec différent champs, donc un champs "savetime" de type VARCHAR(50) qui contient le mois de l'enregistrement (caractères 1 et 2) et le jour (caractères 4 et 5). Je récupère ces caractères pour former une date, que je souhaite comparer avec SYSDATE pour ne conserver que les enregistrements antérieurs à la date d'aujourd'hui.

    Citation Envoyé par McM Voir le message
    J'ai pensé au NULL éliminé par le DISTINCT, mais sur ma base ça bloque.
    Essaye quand même, de vérifier si les SUBSTR ramènent bien des nombres.
    A priori, les substr renvoient bien des nombres.
    Voila la requête exacte que j'utilise, avec distinct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT  to_date(substr(ltrim(savetime),4,2) || '/' || substr(ltrim(savetime),1,2) || '/2008','dd/mm/yyyy') as test1 FROM pool WHERE savetime IS NOT NULL
    J'obtiens trois valeurs distinctes :
    05/08/2008
    06/08/2008
    07/08/2008

    Avec la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select * from 
    (
    select distinct to_date(substr(ltrim(savetime),4,2) || '/' || substr(ltrim(savetime),1,2) || '/2008','dd/mm/yyyy') as test1 from pool where savetime is not null
    ) 
    where test1 < trunc(sysdate,'dd')
    J'obtiens bien les deux premières valeurs seulement.

    Si j'enlève le distinct, j'obtiens une erreur. Pourtant, quand je consulte la liste des valeurs de ce champs sans distinct, aucune ne semble différer... d'ailleurs, le distinct me renverrai plus de 3 champs si ce n'était pas le cas.

    Je continue de chercher... merci pour vos idées


    EDIT : Je viens de vérifier pour les substr, la requête suivante fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT * FROM 
    (
    SELECT substr(ltrim(savetime),4,2) as test1, substr(ltrim(savetime),1,2) AS test2 FROM pool WHERE savetime is not null
    ) 
    WHERE test1 < 7
    AND test2 < 10
    Je pense pouvoir en conclure qu'il me renvoie bien des nombres.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bon, je vais utiliser une solution de contournement, en formant un chiffre de la forme 'yyyymmdd' à partir des dates :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
    FROM pool 
    WHERE savetime IS NOT NULL
    AND '20' || substr(ltrim(savetime),7,2) || substr(ltrim(savetime),1,2) || substr(ltrim(savetime),4,2) < to_char(sysdate,'yyyymmdd')
    Désolé pour le double post.
    Si quelqu'un a mieux, je suis toujours preneur, merci.

  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
    Tu peux lancer la requête suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT substr(ltrim(savetime),4,2) AS test1, substr(ltrim(savetime),1,2) AS test2, count(*)
    FROM pool 
    group by substr(ltrim(savetime),4,2), substr(ltrim(savetime),1,2)
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Merci pour ton aide.
    Je marque le sujet en 'résolu'.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 10/10/2010, 11h46
  2. Réponses: 2
    Dernier message: 05/03/2010, 14h15
  3. Réponses: 4
    Dernier message: 08/11/2009, 21h21
  4. Réponses: 3
    Dernier message: 11/04/2007, 13h46
  5. [VBA-E]demarrer une macro a partir d'une certaine date
    Par lio62 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 21/01/2007, 21h35

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