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

PostgreSQL Discussion :

Condition sur date au format texte et CURRENT_DATE [9.3]


Sujet :

PostgreSQL

  1. #1
    Membre actif

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 370
    Points : 251
    Points
    251
    Par défaut Condition sur date au format texte et CURRENT_DATE
    Bonjour,

    J'ai une colonne:
    dateto character varying(8), -- Fin de validité
    Exemple: contenu de la ligne = 20150806 pour le 06/08/2015.

    Je voudrai avoir une condition comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Where dateto > CURRENT_DATE
    Le seul hic est que les deux cotés de la condition n'ont pas le même format. => String > Date

    Comment faire?

    Cordialement,
    Vandman

  2. #2
    Membre habitué

    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 101
    Points : 141
    Points
    141
    Par défaut
    Vous pouvez caster directement la colonne text ou varchar vers le type "date", si le format que vous décrivez est uniforme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Where dateto::date > CURRENT_DATE

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    La seule solution viable a moyen terme est de modifier le format de cette colonne, du varchar pour une date c'est une hérésie incompréhénsible et malheureusement fréquente

    Avec un tel format de données vous pouvez avoir dans la même colonne des dates de format AAAAMMJJ, JJMMAAAA avec séparateurs, sans séparateurs, et toute autre valeur alphanumérique plus ou moins fantaisiste

    Allez ensuite faire des contrôles de périodes

    LA première qualité d'une base de données étant l'intégrité des données qu'elle contient, modifiez le ddl et vous serez tranquilles

  4. #4
    Membre actif

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 370
    Points : 251
    Points
    251
    Par défaut
    Bonjour,

    je ne suis pas maitre de la base de donnée, je suis obliger de faire avec.
    Par contre, en faisant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Where dateto::date > CURRENT_DATE
    J'obtiens l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ERROR:  date/time field value out of range: "00000000"
     
    ********** Erreur **********
     
    ERROR: date/time field value out of range: "00000000"
    État SQL :22008
    Je me demande si ça ne viens pas du fait que les dates 'dateto' puissent etre égale à '99991231'.
    Une idée?
    Cordialement,
    vandman

  5. #5
    Membre actif

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 370
    Points : 251
    Points
    251
    Par défaut
    Bonjour,
    Je m'auto répond.

    La solution vient en faisant comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Where dateto > to_char(CURRENT_DATE, 'YYYYMMDD')
    Cordialement,
    Vandman

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    99991231 est une date valide dans une colonne de format date, et dans une date de fin, c'est classiquement une période ouverte, donc sans date de fin.

    Harcelez votre fournisseur, faites vous appuyer par votre hiérarchie, une date n'a rien à faire dans du varchar, vous aller passer un temps considérable a essayer de contourner cette modélisation aberrante et scandaleuse, et vous n'aurez jamais garantie d'un résultat correct.

  7. #7
    Membre habitué

    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 101
    Points : 141
    Points
    141
    Par défaut
    Citation Envoyé par vandman Voir le message
    Bonjour,

    je ne suis pas maitre de la base de donnée, je suis obliger de faire avec.
    Par contre, en faisant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Where dateto::date > CURRENT_DATE
    J'obtiens l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ERROR:  date/time field value out of range: "00000000"
     
    ********** Erreur **********
     
    ERROR: date/time field value out of range: "00000000"
    État SQL :22008
    Je me demande si ça ne viens pas du fait que les dates 'dateto' puissent etre égale à '99991231'.
    Une idée?
    Cordialement,
    vandman

    Non, c'est parce que si l'année zéro est convertible, ce n'est pas le cas du 0ème jour d'un mois 0, qui ne correspond à rien au format date, et PostgreSQL lève correctement une erreur. Par contre votre solution est meilleure, car elle résiste mieux au fait que PostgeSQL est souvent configuré par défaut sur le format de date américain ('mdy') sans que l'on s'en avise forcément.

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

Discussions similaires

  1. [AC-2010] Filtre sur date en format texte
    Par boban90 dans le forum Access
    Réponses: 10
    Dernier message: 22/05/2014, 09h36
  2. [XL-MAC 2011] Probleme application du filtre avancé sur les dates en format texte
    Par go4music dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 17/06/2013, 00h10
  3. [AC-2010] Requête sur une plage de date au format texte
    Par shakapouet dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 26/07/2012, 16h05
  4. Tri de dates au format texte
    Par stem dans le forum Outils
    Réponses: 9
    Dernier message: 09/08/2006, 17h47
  5. [Access] requete sql avec condition sur date
    Par qeja dans le forum Langage SQL
    Réponses: 4
    Dernier message: 25/03/2006, 23h54

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