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

DB2 Discussion :

Format date dans clause Where


Sujet :

DB2

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Par défaut Format date dans clause Where
    Bonjour,
    Je n'ai jamais utilisé DB2.
    J'ai une requête (avec l'ETL Genio) a faire une base DB2 for iseries5. J'aimerais faire une requete qui selectionne les données entre 2 dates (between).

    Ma table source contient 3 colonnes numériques pour chacune des données: année, mois, jour.
    Je suis donc obligée de construire ma date.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT   VOA4,
    VOMM,
    VOJJ,
    date(concat(concat(concat(concat(G_T0.VOA4,'-'),G_T0.VOMM),'-'),G_T0.VOJJ)) as d_day_of_origin_date,
    CHAR(date(concat(concat(concat(concat(G_T0.VOA4,'-'),G_T0.VOMM),'-'),G_T0.VOJJ)),eur) as d_day_of_origin,
    FROM  "N.VOLS"
    WHERE 
    and LTRIM(RTRIM(CHAR(G_T0.VOA4))) CONCAT '-'  CONCAT LTRIM(RTRIM(CHAR(G_T0.VOMM))) CONCAT '-'  CONCAT LTRIM(RTRIM(CHAR(G_T0.VOJJ)))  = LTRIM(RTRIM(char(2008))) CONCAT '-'  CONCAT LTRIM(RTRIM(CHAR(10))) CONCAT '-'  CONCAT LTRIM(RTRIM(CHAR(3)))
    Mon problème est que lorsque je fais un between entre 2 dates, j'ai trop de données:
    Ex: si je sélectionne entre le 03/10/2008 et le 04/10/2008, la requête me renvoie les dates du 03/10/2008, 04/10/2008, 30/10/2008 et 31/10/2008
    car ma fonction dans le where n'est pas au format date.

    Lorsque je mets la fonction "date()" dans le select, je n'ai pas de souci.
    Par contre, dès que je la met dans le where, j'ai une erreur:
    [SQL0181] Value in date, time, or timestamp string not valid.
    Vous avez une idée pour que je puisse sélectionner mes dates dans le where?

  2. #2
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Par défaut
    PS: J'ai oublie de preciser que j'ai tourné ma fonction ds ts les sens : DD/MM/YYYY , MM/DD/YYYY , etc...

  3. #3
    Membre chevronné Avatar de rberthou
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 612
    Par défaut
    Je ne connais pas l'optimisateur SQL de ton DB2 mais il y a pas mal de chance que ce que tu souhaite faire désactive complètement les indexes de ta table (sur les colonnes en question).

    Personnelement je ferais soit :
    1 - Le mieux : Ajouter une véritable colonne date (au pire un char de 8 au format YYYYMMDD)
    2 - utiliser ce style de requete (plsu longue visuellement mais plus simple a lire et je pense plus rapide)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    where
     ( 
        ( annee = 2007 and  mois = 10 and jours > 15 )   or
        ( annee = 2007 and  mois > 10 )   or
        ( annee > 2007  )   
      )  
      and 
      ( 
        ( annee = 2008 and  mois = 11 and jours < 5 )   or
        ( annee = 2008 and  mois < 11 )   or
        ( annee < 2008  )   
      )

  4. #4
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Par défaut
    Ah oui c'est pas bete ca!

    Je tente.

  5. #5
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Par défaut
    ça fonctionne comme ça, même avec mes variables. Donc parfait.

    Merci bcp!

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Par défaut
    Voici ce que ferait probablement un programmeur sous DB2 :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT   VOA4, VOMM, VOJJ,
    date(   char(VOA4)      concat   '-'   concat
            char(VOMM)     concat   '-'   concat
            char(VOJJ)      ) AS d_day_of_origin
    FROM  N.VOLS
    WHERE 
    date(   char(VOA4)      concat   '-'   concat
            char(VOMM)     concat   '-'   concat
            char(VOJJ)      ) 
    between date('2008-10-03') and date('2008-10-04')
    @+

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/06/2014, 10h25
  2. Performance sur dates dans clause Where
    Par lbar012001 dans le forum PL/SQL
    Réponses: 3
    Dernier message: 20/02/2011, 15h38
  3. Select avec "date d'un premier élément" dans clause Where
    Par adrien357 dans le forum Requêtes
    Réponses: 9
    Dernier message: 05/11/2008, 15h27
  4. [SQL 9i ] format de date dans un where
    Par booth dans le forum Oracle
    Réponses: 5
    Dernier message: 14/10/2005, 10h23
  5. Réponses: 3
    Dernier message: 21/02/2005, 00h29

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