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

Oracle Discussion :

Faire un where sur un champs date qui peut etre vide


Sujet :

Oracle

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Faire un where sur un champs date qui peut etre vide
    Bonjour,
    Je pense que ma demande n'est pas très compliquée... mais je n'y arrive pas

    en fait j'ai une base de données avec une liste de membres qui possède un champ qui contient une date du style "dd/mm/yyyy" ou qui peut être vide.
    J'essaie de lister l'ensemble des membres dont la date (SI ELLE EXISTE) n'est pas inférieure à la date du jour.

    J'ai essayé la chose suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT  MEMBER_FIRST_NAME, MEMBER_LAST_NAME, MEMBER_COMPANY FROM MEMBERS
    WHERE MEMBER_INTRANET = 1
    AND (MEMBER_CONTRACT_END IS NOT NULL OR MEMBER_CONTRACT_END < '#todayDate#')
    ORDER BY MEMBER_LAST_NAME
    mais ça ne semble pas marcher.. certains champs n'apparaissent pas

  2. #2
    Membre habitué
    Inscrit en
    Décembre 2005
    Messages
    455
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 455
    Points : 166
    Points
    166
    Par défaut
    Bonjour,

    A quoi correspond todayDate?
    Pour avoir la date du jour tu peux aussi utiliser sysdate non?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Ne serait-ce pas plus simple d'utiliser :
    nvl(MEMBER_CONTRACT_END,'31/12/9999') < sysdate

  4. #4
    Membre habitué Avatar de VinceTlse
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 163
    Points : 191
    Points
    191
    Par défaut
    Bonjour,
    Je pense que tu devrais regarder la fonction DECODE. Elle peut etre utile dans ton cas.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    merci pour toutes vos réponses

    alors dans l'odre todayDate est une variable qui contient la date du jour au format dd/mm/yyyy

    j'ai testé la solutions de ogaudinu avec la fonction nvl et j'ai le droit à une erreur qui me dit : [Oracle]ORA-01843: not a valid month

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    C'est simplement que le format par défaut doit être mm/dd/yyyy, il faut donc inverser les 31 et le 12 en conséquence...

    l'année à 9999 ne passe peut-être pas sous Oracle (j'avoue avoir un doute !) mais l'idée est là ;-)

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    j'ai essayer d'inverser le mois de le jour, d'enleve le 0 au mois de mettre une année style 2008 au lieu de 9999 :-)
    et le vilain oracle me donne toujours la meme erreur

  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
    SI vous ne voulez pas vous embêter avec les format de date uitlisez sysdate + 80000 par exemple.

    où même, dans votre exemple, sysdate + 1 suffirait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nvl(MEMBER_CONTRACT_END,sysdate+1) < sysdate

  9. #9
    Membre habitué
    Inscrit en
    Décembre 2005
    Messages
    455
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 455
    Points : 166
    Points
    166
    Par défaut
    Pourquoi ne pas faire juste sysdate +1 au lieu de mettre '31/12/9999'?

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    ha effectivement je n'y avais pas du tout pensé... et forcement ça marche impec
    merci beaucoup pour votre aide !!

  11. #11
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut Re: Faire un where sur un champs date qui peut etre vide
    Citation Envoyé par blueman
    l'ensemble des membres dont la date (SI ELLE EXISTE) n'est pas inférieure à la date du jour.
    si ta version n'est pas trop ancienne, tu peux essayer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select d from t where lnnvl(d>sysdate)
    lnnvl est une des rares fonctions qui retourne un booléen et qui soit valide en SQL

  12. #12
    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
    Fonctionne en 9.0.2, uniquement dans une clause where et n'est documentée que depuis la 10g.

  13. #13
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    ou tout autre expression acceptant un boolean

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SQL> select case when lnnvl(''='x') then 1 end from dual;
                                1
     
    SQL> select 1 from dual having lnnvl(''='x');
             1
    note que dans DECODE, sa déconne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SQL> select decode(lnnvl(1=2),lnnvl(1=1),1,lnnvl(1=2),2,3) from dual
             1
    mais bon, decode n'est pas supposé fonctionner avec des booléens, il y a sans doute une conversion implicite de BOOLEAN vers NULL, d'où decode(null,null,1,null,2,3)=1

Discussions similaires

  1. [DTD] Champ qui peut etre vide
    Par hassane03 dans le forum Valider
    Réponses: 2
    Dernier message: 28/05/2013, 16h38
  2. Requête SQL sur une base Access, where sur un champ date
    Par digital prophecy dans le forum Bases de données
    Réponses: 1
    Dernier message: 09/05/2008, 16h47
  3. Réponses: 3
    Dernier message: 19/06/2007, 22h34
  4. Tri dans une DBGrid sur un champ date au format jj/mm
    Par Jeankiki dans le forum Bases de données
    Réponses: 10
    Dernier message: 31/10/2004, 12h32
  5. [CR] Problème de sélection sur un champ date
    Par noluc dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 21/11/2003, 16h56

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