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 :

Utilisation d'un DECODE pour comparer des dates


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2011
    Messages : 163
    Points : 89
    Points
    89
    Par défaut Utilisation d'un DECODE pour comparer des dates
    Bonjour,

    J'ai un champ calculé Date_extract que j'ai récupéré avec un SYSDATE au format : 04/12/2013
    J'ai un champ date_operation que j'ai récupéré avec TO_DATE(Datfin,'yyyymmdd') pour avoir le même format de date que Date_extract.

    Enfin j'utilise un champ calculé pour comparer ces deux dates :

    DECODE('Date_fin < Date_extract','OK','KO')

    La comparaison ne fonctionne pas car le champ me retourne un champ vide.

    Une idée ?

    Cordialement

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Les dates n'ont pas de format; date est un type de donnée. Le format concerne seulement les transformations des dates en chaines de caractères (un autre type des donnée) ou inverse.

    Votre Decode est farfelue il compare la chaine des caractères 'Date_fin < Date_extract' avec la chaine des caractères 'OK'.

    Pour comparer deux date pour l'inégalité utilisez Case ou faite preuve d'imagination avec Decode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Select Decode(Sign(sysdate - (sysdate + 3) ),-1,'OK', 'KO') Test
      from dual

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Une date n'a pas de format, c'est un type de donnée.
    Donc il suffit de comparer directement les 2 dates si date_operation et Date_extract sont bien du type date.
    Pour éviter de comparer les composantes horaires, si c'est le besoin, utilisez TRUNC(la_date).

    Par ailleurs essayez de garder un minimum de cohérence dans la présentation de l'information :
    SYSDATE au format : 04/12/2013
    ...
    un champ date_operation
    ...
    TO_DATE(Datfin,'yyyymmdd') pour avoir le même format
    Les noms changent ainsi que le format...

  4. #4
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2011
    Messages : 163
    Points : 89
    Points
    89
    Par défaut
    Merci de ton aide,

    J'ai testé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Decode(Sign(sysdate - Date_fin ),-1,'OK', 'KO')
    Ça me dit calcul de date non pris en charge

    J'ai aussi testé avec un Case

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CASE WHEN 'Date_fin_ope - Date_extract' = '-1' THEN 'KO' ELSE 'OK' END
    Fonctionne pas non plus, il me sort comme résultat OK pour chaque ligne retournée

    Dsl je ne suis pas expert dans ce domaine, je comprend peut être mal le principe.

    Cordialement

  5. #5
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Assurez-vous que Date_fin est une date et non pas une chaine des caractères contenant une date.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Decode(Sign(sysdate - Date_fin ),-1,'OK', 'KO')
    Vous continuez à comparer les poires avec la choucroute. Dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CASE WHEN 'Date_fin_ope - Date_extract' = '-1' THEN 'KO' ELSE 'OK' END
    'Date_fin_ope - Date_extract' est une chaine des caractères et non pas une opération entre deux dates.

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2011
    Messages : 163
    Points : 89
    Points
    89
    Par défaut
    Mon champ Date_fin est créer à partir d'un autre champ Datop qui est au format 20130228.
    Je le transforme au format 28/02/2013 en utilisant : TO_DATE(Datop,'yyyymmdd')

    Je suppose donc que le champ Datop n'est pas un format Date donc je ne peut pas faire la comparaison ?

    Y aurait il un autre moyen de contourner ce problème ?

    Cordialement

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Vérifiez le type de donnée des colonnes, si ce sont bien des dates alors faites simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CASE WHEN Date_fin_ope < Date_extract THEN 'OK' ELSE 'KO' END

Discussions similaires

  1. [Toutes versions] Code VBA pour comparer des dates
    Par Tagada_Or dans le forum VBA Access
    Réponses: 17
    Dernier message: 24/09/2014, 09h08
  2. Fonction pour comparer des dates en matlab
    Par mihaispr dans le forum MATLAB
    Réponses: 2
    Dernier message: 19/07/2009, 16h40
  3. DATE_FORMAT pour comparer des dates
    Par Maryy dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 09/03/2008, 20h50
  4. regex pour comparer des dates, des chiffres, des nombres
    Par lex13 dans le forum Collection et Stream
    Réponses: 14
    Dernier message: 06/07/2007, 11h51
  5. Probleme Pour Comparer Des Dates
    Par Domingo60 dans le forum VBScript
    Réponses: 7
    Dernier message: 25/04/2007, 09h33

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