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 :

Conversion de date


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 168
    Par défaut Conversion de date
    Bonjour à tous,

    Dans une table mytable il y a un champs qui s'appelle ResoDate de format Date et qui prend des valeurs comme '01-Feb-11'

    Une personne a changé le format de ce champs en char du coup la requête suivante ne marche plus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select * from mytable where 
     
    trunc (ResoDate) between '01-Feb-11' and '28-Feb-11'
    Est-il possible de remédier à cela ?

    Je vous remercie

  2. #2
    Membre actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mali

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2009
    Messages : 73
    Par défaut Réinitialiser le format initial
    Salut,

    Ce qui serait mieux dans ce cas c'est de faire

    -->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ALTER TABLE mytable MODIFY ResoDate DATE
    Si ça marche tant mieux, sinon tu seras obligé de convertir les données à comparer en format date correspondante.

    Puisque les fonctions de conversions différent selon les SGBD; merci d'avoir préciser le tien.

    Bonne chance, du courage.


  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 168
    Par défaut
    Merci pour ta réponse,

    Il ne faut pas que je change la table avec alter car plusieurs personnes travaillent avec.

    Je suis donc obligé de faire un truc qui ressemble à un Cast dans mes requêtes SQL.

    J'ai essayé ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * FROM mytable WHERE 
     
    trunc (ResoDate) BETWEEN '01-Feb-11' AND '28-Feb-11'
    Mais j'ai ce message :

    ORA-01843
    not a valid month


    J'utilise TOAD

    Merci

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par wissem.ba Voir le message
    Dans une table mytable il y a un champs qui s'appelle ResoDate de format Date et qui prend des valeurs comme '01-Feb-11'
    En SQL, les dates sont au format 'aaaa-mm-jj', toutes les parties de ce format étant numériques. Alors '01-Feb-11' pour moi, ce n'est pas une date SQL mais une chaîne de caractères !

    Et au passage, il n'y a pas de champ dans une table mais des colonnes !

    Une personne a changé le format de ce champs en char
    Il n'a peut-être pas eu tord si les dates sont effectivement enregistrées en BDD tel que tu nous l'as écrit, sinon si la colonne contient effectivement des dates valides, c'est stupide d'avoir transformé ça en chaîne de caractères ! Surtout qu'on ne touche pas comme ça à la structure d'une BDD sans en mesurer les conséquences !

    du coup la requête suivante ne marche plus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select * from mytable where 
     
    trunc (ResoDate) between '01-Feb-11' and '28-Feb-11'
    Laquelle requête aurait dû être celle-ci, en évitant la guerre des étoiles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT les_colonnes_necessaires_et_pas_etoile
    FROM mytable -- en espérant qu'elle a un nom plus explicite !
    WHERE ResoDate BETWEEN '2011-02-01' AND '2011-02-28'
    Est-il possible de remédier à cela ?
    Oui en convertissant la chaîne de caractères en type DATE.

    Tu peux essayer directement ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT les_colonnes_necessaires_et_pas_etoile
    FROM mytable -- en espérant qu'elle a un nom plus explicite !
    WHERE CAST(ResoDate AS DATE) BETWEEN '2011-02-01' AND '2011-02-28'
    Si ça ne fonctionne pas, il faut utiliser les fonctions de traitement des dates de ton SGBD.

    Par exemple, avec MySQL et ton format de date non standard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT les_colonnes_necessaires_et_pas_etoile
     FROM mytable -- en espérant qu'elle a un nom plus explicite !
     WHERE STR_TO_DATE(ResoDate, '%d-%b-%y') BETWEEN '2011-02-01' AND '2011-02-28'
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 168
    Par défaut
    Merci,

    Ce que j'ai fait c'est regarder ce qu'il y a dans la colonne ResoDate et effectivement j'ai trouvé des valeurs de ce genre :

    25/08/09 18:32:10

    J'ai conclut donc que le format est de type : dd/mm/yy hh24:mi:ss

    Ce que j'ai fait donc (pour ceux qui auront dans le futur le même problème)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    trunc (TO_DATE(RESOLUTIONDATE, 'dd/mm/yy hh24:mi:ss')) between '01/02/11' and '28/02/11'
    Et cela a bien marché.

    Je vous remercie et bien noté pour utiliser le terme colonne et non champ

    Je vais appliquer cela à tous les scripts que je dois lancer, si jamais il y a un souci je reviens poser ma question

  6. #6
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 168
    Par défaut
    J'y reviens

    Cela ne marche pas sur TOAD mais marche bien sur Oracle SQL Developper

    Sachant que TOAD est juste un requeteur et qu'il y a Oracle derrière.

    Est-ce normal ?

Discussions similaires

  1. Conversion de date
    Par jdu dans le forum Access
    Réponses: 2
    Dernier message: 26/01/2005, 16h17
  2. Conversion de dates
    Par Gogoye dans le forum Modules
    Réponses: 5
    Dernier message: 10/08/2004, 11h39
  3. - [CAST ou CONVERT] Problème de conversion de date
    Par Boublou dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 06/07/2004, 14h31
  4. Conversion de date lors d'un import
    Par bilbon.S dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 26/03/2004, 14h33
  5. Conversion de date et division 64 bits
    Par dway dans le forum Assembleur
    Réponses: 38
    Dernier message: 27/01/2004, 10h31

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