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

Langage SQL Discussion :

Pb encadrement Date


Sujet :

Langage SQL

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 139
    Points : 73
    Points
    73
    Par défaut Pb encadrement Date
    Bonjour à tous,

    J'utilise Mysql Quiery Brother

    J'ai cherché multiple syntaxes mais en vain ma requête ne renvoie pas le nombre suffisant de lignes.
    L'idée est de dire :
    Si la dte de document, de confirmation, de livraison est nulle ou égale à 00-00-0000 alors cette date sera égale à 1900-01-01

    Enfin si :
    TY_doc = DMA alors on prend la date de document entre 1900-01-01 et 2099-12-31
    Ty_doc= CDA alors on prend la date de confirmation entre 1900-01-01 et 2099-12-31
    Ty_doc = FA alors on prend la date de livraison entre 1900-01-01 et 2099-12-31
    Ty_doc=BE alors on prend la date de document entre 1900-01-01 et 2099-12-31

    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
    SELECT
     A.id_produit,
      case
                    when A.dt_document is null then A.dt_document = "1900-01-01"
                    when A.dt_document = "0000-00-00" then A.dt_document="1900-01-01"
                    else A.dt_document end as dt_document,
       case
                    when A.dt_confirmation is null then A.dt_confirmation = "1900-01-01"
                    when A.dt_confirmation = "0000-00-00" then A.dt_confirmation = "1900-01-01"
                    else A.dt_confirmation end as dt_confirmation,
     
       case         when A.dt_livraison is null then A.dt_livraison = "1900-01-01"
                    when A.dt_livraison = "0000-00-00" then A.dt_livraison="1900-01-01"
                    else A.dt_livraison end as dt_livraison
    FROM tbl_achat A
    WHERE
     case
       when A.ty_document = "DMA" then Dt_document between "1900-01-01" and "2099-12-31"
       when A.ty_document = "BE" then Dt_document between "1900-01-01" and "2099-12-31"
       when A.ty_document = "FA" then dt_confirmation between "1900-01-01" and "2099-12-31"
       when A.ty_document = "CDA" then dt_livraison between "1900-01-01" and "2099-12-31"
      end
    Voyer vous une erreur ?

    NB : Les betweens sont ici pour entrer les valeurs ds des paramètres. (Jasperreport)

  2. #2
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Il ne vous manquerait pas les tuples avec les dates nulles par hasard ??
    Votre clause WHERE filtre vos dates et donc vos CASE ne servent plus a rien dans le corps de votre requete.

    Revoyez donc la clause de votre requete afin qu'elle vous rammene TOUS les tuples que vous desirez et apres vous pourrez appliquer vos CASE a vos résultats

    Bon courage

  3. #3
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 139
    Points : 73
    Points
    73
    Par défaut
    Oui, en effet, les tuples avec des dates nulles ne remontent pas !

    J'essaye de les convertir dans le WHERE mais ....
    Cela ne marche toujours pas ....

    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
     
    Select (*)
    FROM Tbl_ligneachat
    WHERE 
     
    if(A.dt_document is null,"1900-01-01",A.dt_document)
    and if(A.dt_document = "0000-00-00","1900-01-01",A.dt_document)
    and if(A.dt_confirmation is null,"1900-01-01",A.dt_confirmation)
    and if(A.dt_confirmation ="0000-00-00","1900-01-01",A.dt_confirmation)
    and if(A.dt_livraison is null,"1900-01-01",A.dt_livraison)
    and if(A.dt_livraison ="0000-00-00","1900-01-01",A.dt_livraison)
     and
      case
       when A.ty_document = "DMA" then Dt_document between "1900-01-01" and "2099-12-31"
       when A.ty_document = "BE" then Dt_document between "1900-01-01" and "2099-12-31"
       when A.ty_document = "FA" then dt_confirmation between "1900-01-01" and "2099-12-31"
       when A.ty_document = "CDA" then dt_livraison between "1900-01-01" and "2099-12-31"
      end
    Là, j'avoue que je bloque ....
    Peut être un autre indice ???

  4. #4
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Autre indice, le fait d'avoir déplacé votre code dans le WHERE comme vous l'avez fait ne va pas resoudre votre probleme. Pourquoi ??

    A cause de votre case :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    case
       when A.ty_document = "DMA" then Dt_document BETWEEN "1900-01-01" AND "2099-12-31"
       when A.ty_document = "BE" then Dt_document BETWEEN "1900-01-01" AND "2099-12-31"
       when A.ty_document = "FA" then dt_confirmation BETWEEN "1900-01-01" AND "2099-12-31"
       when A.ty_document = "CDA" then dt_livraison BETWEEN "1900-01-01" AND "2099-12-31"
      end
    en effet, vos dates nulles ne seront pas prises en compte a ce moment la de l'execution de la requete

    Faites quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    case
       when A.ty_document = "DMA" then /* En fonction de votre type de doc */
          case Dt_document  when NULL then /*Test de la nullité de la date */
             '1900-01-01' 
          else 
             Dt_document 
          end 
          BETWEEN "1900-01-01" AND "2099-12-31"
     
    [...]
    Bon courage

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Petit aparté, mais MySQL permet-il d'utiliser simple quote et double quote sans problème ?

  6. #6
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 139
    Points : 73
    Points
    73
    Par défaut
    Grand merci à Yanika et bonjour à la Bretagne !

    La requête me renvoie maintenant tous les tuples !!!


    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
    34
    35
    36
    37
    38
     
    SELECT (*)
    FROM Tbl_ligneachat
    WHERE 
    case
       when A.ty_document in ("DMA","BE") then /* En fonction de votre type de doc */
        case A.dt_document  when NULL then /*Test de la nullité de la date */
             "1900-01-01"
                              when "0000-00-00" then /*Test de la nullité de la date */
             "1900-01-01"/
         else
             Dt_document
          end
          BETWEEN "1900-01-01" AND "2099-12-31"
     
     
     
       when A.ty_document = "CDA" then /* En fonction de votre type de doc */
          case A.dt_confirmation  when NULL then /*Test de la nullité de la date */
             "1900-01-01"
                               when "0000-00-00"  then/*Test de la nullité de la date */
             "1900-01-01"   
     else
             Dt_confirmation
          end
          BETWEEN "1900-01-01" AND "2099-12-31"
     
     
       when A.ty_document = "fA" then /* En fonction de votre type de doc */
          case A.dt_livraison  when NULL then /*Test de la nullité de la date */
             "1900-01-01"
          when "0000-00-00" then /*Test de la nullité de la date */
              "1900-01-01"
           else
             Dt_livraison
          end
          BETWEEN "1900-01-01" AND "2099-12-31" 
          end
    Waldar :

    J'utilise tout le temps les doubles côtes pour tous les formats ( Date, String, Integer ...).
    Je ne sais pas pour les simples côtes.

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Je pense que c'est une erreur, date et chaîne doivent plutôt être entre simple quote et rien pour les nombres (sinon votre base de donnée effectue une conversion texte -> nombre).

    Merci pour la réponse et fin de l'aparté.

  8. #8
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 139
    Points : 73
    Points
    73
    Par défaut
    Citation Envoyé par ALLODREN Voir le message
    Grand merci à Yanika et bonjour à la Bretagne !

    La requête me renvoie maintenant tous les tuples !!!

    -----> FAUX !!!

    Cette requête me convertie bien les dates systèmes égales à ( 0000-00-00 ) mais remplace par 0.
    Du coup mes filtres ne prennent pas en compte cette valeurs.

    Je comprends mieux maintenant la réaction de WAdAR !

    Eh oui ! La syntaxe n'est pas bonne... J'ai essayé ttes les possibilités avec double côtes, simples côtes .... Mais cela ne m'écrit pas la date ...

    Je vous tiens au courant quand je trouve la bonne syntaxe.
    Sinon, je vais regarder les autres fonction SQL ( replace ...)

  9. #9
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Mais quel est donc le typage de vos colonnes date ?
    Avoir 0000-00-00 comme date me semble un peu suréaliste.

  10. #10
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 139
    Points : 73
    Points
    73
    Par défaut
    '0000-00-00' correspond à la date récupérée par l'ETL dans une base de données (AS-400).
    C'est une date de valeur par défaut dans base de données.

    Je dois convertir les valeurs dates nulles ( champs vide ) et les valeurs dates types (0000-00-00) pour les faire remonter dans mon filtre : De (1900-01-01) à (2099-12-31) (Dates bornes/encadrement système de Jasper).

    -----> Je viens de me rendre compte d'un autre soucis qui pourrait fausser mes résultats dans ma requête ...

    Veuillez m'excuser mais ma requête fait plus de 100 lignes ... alors il y a parfois des artefacts !

  11. #11
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Tenez nous au courant de vos recherches...
    Bon courage

Discussions similaires

  1. Encadrement de dates
    Par ALLODREN dans le forum Requêtes
    Réponses: 2
    Dernier message: 03/12/2009, 17h42
  2. Réponses: 11
    Dernier message: 23/07/2002, 14h33
  3. Generation d'evenements a une date precise
    Par pascalzzz dans le forum MFC
    Réponses: 2
    Dernier message: 04/06/2002, 15h21
  4. Réponses: 3
    Dernier message: 06/05/2002, 18h24
  5. Réponses: 3
    Dernier message: 19/04/2002, 00h11

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