Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/03/2011, 12h23   #1
Membre à l'essai
 
Inscription : janvier 2009
Messages : 159
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 159
Points : 21
Points : 21
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 :
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
wissem.ba est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 13h37   #2
Futur Membre du Club
 
Inscription : août 2009
Messages : 22
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 22
Points : 15
Points : 15
Envoyer un message via Yahoo à dramanebox Envoyer un message via Skype™ à dramanebox
Par défaut Réinitialiser le format initial

Salut,

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

-->
Code :
 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.

dramanebox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 13h50   #3
Membre à l'essai
 
Inscription : janvier 2009
Messages : 159
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 159
Points : 21
Points : 21
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 :
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
wissem.ba est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 13h59   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 998
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 998
Points : 18 262
Points : 18 262
Envoyer un message via MSN à CinePhil
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 !

Citation:
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 !

Citation:
du coup la requête suivante ne marche plus

Code :
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 :
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'
Citation:
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 :
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 :
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 14h30   #5
Membre à l'essai
 
Inscription : janvier 2009
Messages : 159
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 159
Points : 21
Points : 21
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 :
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
wissem.ba est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 14h58   #6
Membre à l'essai
 
Inscription : janvier 2009
Messages : 159
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 159
Points : 21
Points : 21
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 ?
wissem.ba est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h22.


 
 
 
 
Partenaires

Hébergement Web