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 04/08/2008, 10h10   #1
Membre actif
 
Inscription : avril 2007
Messages : 483
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : avril 2007
Messages : 483
Points : 189
Points : 189
Par défaut Requêtes sur les dates

Bonjour,

Voila j'aimerai savoir comment récupérer le trimestre en cours en connaissant le mois en cours.

j'ai trouvé la fonction to_date pour mettre dans le where, je voudrais donc faire un truc du genre
Code :
SELECT * FROM ma_table WHERE champ_date = to_date(sysdate, 'q');
le q étant pour quarter (trimestre donc)

Mais cette requete ne marche pas elle retourne :
Citation:
ORA-01820: format code cannot appear in date input format
Pouvez vous m'aider Merci d'avance
Sh4dow49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2008, 10h50   #2
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : Conseil

Informations forums :
Inscription : janvier 2004
Messages : 2 866
Points : 3 448
Points : 3 448
En utilisant le to_date, tu essaies de convertir une chaîne de caractère en date.

Si tu veux récupérer le trimestre :
Code :
1
2
3
4
SQL> SELECT to_char(sysdate, 'q') FROM dual;
T
-
3
Si tu veux récupérer le 1è jour du trimestre :
Code :
1
2
3
4
SQL> SELECT trunc(sysdate, 'q') FROM dual;
TRUNC(SY
--------
01/07/08
A partir de là tu devrais t'en sortir pour obtenir le résultat que tu souhaires
__________________
Un problème sans solution est un problème mal posé

Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2008, 11h06   #3
Membre actif
 
Inscription : avril 2007
Messages : 483
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : avril 2007
Messages : 483
Points : 189
Points : 189
alors j'ai essayé en remplaçant mon to_date par to_char mais la requête ne retourne toujours rien et je ne vois pas d'autres façons de faire ... (je suis un peu une bille en sql ça aide pas )
Sh4dow49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2008, 11h22   #4
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : Conseil

Informations forums :
Inscription : janvier 2004
Messages : 2 866
Points : 3 448
Points : 3 448
A quoi correspond ta colonne champ_date ?
__________________
Un problème sans solution est un problème mal posé

Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2008, 11h31   #5
Membre actif
 
Inscription : avril 2007
Messages : 483
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : avril 2007
Messages : 483
Points : 189
Points : 189
En fait j'ai un script écrit en php qui tourne toutes les 5 minutes (configuré dans mon crontab) et qui récupère la disponiblilité de toutes mes appli et enregistre ça dans ma table

mon champ champ_date corresponds donc à la date + l'heure de la vérif
en gros je fais un
Code :
INSERT INTO ma_table(champ_date) VALUES (sysdate);
Sh4dow49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2008, 11h54   #6
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : Conseil

Informations forums :
Inscription : janvier 2004
Messages : 2 866
Points : 3 448
Points : 3 448
Et tu ne vois pas le problème ? Tu compares une date à une chaîne de caractère... Compares des choses identiques et cela fonctionnera
__________________
Un problème sans solution est un problème mal posé

Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2008, 11h58   #7
Membre actif
 
Inscription : avril 2007
Messages : 483
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : avril 2007
Messages : 483
Points : 189
Points : 189
Le truc c'est que si je fais quelque chose du genre
Code :
SELECT * FROM ma-TABLE WHERE champ_date = to_char(sysdate, 'DD/MM/YYYY');
ou encore
Code :
SELECT * FROM ma-TABLE WHERE champ_date = to_char(sysdate, 'DD - HH24:MI:SS');
ça marche. donc est-ce vraiment un problème de ce type ?

Et puis si j'insérais un char dans un champ de type date oracle m'aurait retourné une erreur non ? le sysdate ne serait-il pas converti automatiquement en date ? (beaucoup de questions certes mais c'est pour mieux comprendre par la suite)
Sh4dow49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2008, 12h21   #8
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : Conseil

Informations forums :
Inscription : janvier 2004
Messages : 2 866
Points : 3 448
Points : 3 448
Citation:
Envoyé par Sh4dow49 Voir le message
Le truc c'est que si je fais quelque chose du genre
Code :
SELECT * FROM ma-TABLE WHERE champ_date = to_char(sysdate, 'DD/MM/YYYY');
ou encore
Code :
SELECT * FROM ma-TABLE WHERE champ_date = to_char(sysdate, 'DD - HH24:MI:SS');
ça marche. donc est-ce vraiment un problème de ce type ?
Oui puisque dans ce cas tu compares des choses identiques. Oracle arrive donc à faire une conversion implicite.

Si tu fais un to_char(sysdate, 'q'), c'est une chaîne de caractères sous forme de nombre qui est renvoyée et non sous forme de date, donc ce n'est pas une comparaison cohérente.

=> soit tu compares des chaînes de caractères correspondant au numéro de trimestre:
Code :
SELECT * FROM ma-TABLE WHERE to_char(champ_date, 'q') = to_char(sysdate, 'q');
=> soit tu compares des dates tronquées au premier jour du trimestre :
Code :
SELECT * FROM ma-TABLE WHERE trunc(champ_date, 'q') = trunc(sysdate, 'q');
__________________
Un problème sans solution est un problème mal posé

Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2008, 12h56   #9
Membre actif
 
Inscription : avril 2007
Messages : 483
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : avril 2007
Messages : 483
Points : 189
Points : 189
Ok ok, je comprends. Tes requêtes marchent bien, merci beaucoup pour ton aide, j'y vois plus clair !
Sh4dow49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2008, 13h05   #10
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : Conseil

Informations forums :
Inscription : janvier 2004
Messages : 2 866
Points : 3 448
Points : 3 448
Citation:
Envoyé par Sh4dow49 Voir le message
j'y vois plus clair !
C'est ça le plus important
__________________
Un problème sans solution est un problème mal posé

Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2008, 13h59   #11
Membre actif
 
Inscription : avril 2007
Messages : 483
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : avril 2007
Messages : 483
Points : 189
Points : 189
Je reviens sur mon sujet, je pensais avoir saisi l'esprit mais il s'avère que j'ai encore un problème ...

J'ai testé plusieurs sortes de requête dont :
Code :
SELECT * FROM ma_table WHERE to_char(champ_date, 'DD/MM/YYYY') = to_char(sysdate, 'DD/MM/YYYY');
qui fonctionne et me renvoie bien tous les enregistrements créés aujourd'hui, et :
Code :
SELECT * FROM ma_table WHERE to_char(champ_date, 'DD/MM/YYYY') = to_char('30/07/2008', 'DD/MM/YYYY');
qui ne marche pas ...

J'ai essayé des between aussi mais dès que la date renseignée est une autre que sysdate, erreur suivante :
Citation:
ORA-0843: not a valid number
J'ai pas du bien comprendre un truc
Sh4dow49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2008, 14h04   #12
Expert Confirmé
 
Avatar de LeoAnderson
 
Inscription : septembre 2004
Messages : 2 942
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 2 942
Points : 2 972
Points : 2 972
Code :
SELECT * FROM ma_table WHERE champ_date = to_date ('30/04/1985', 'DD/MM/YYYY')
LeoAnderson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2008, 14h07   #13
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : Conseil

Informations forums :
Inscription : janvier 2004
Messages : 2 866
Points : 3 448
Points : 3 448
Ce qu'il faut que tu comprennes c'est que les fonctions TO_xxx sont des fonctions de conversion.

to_char(sysdate, 'DD/MM/YYYY') a un sens puisque tu convertis la date du jour en chaine de caractères au format DD/MM/YYYY

Mais to_char('30/07/2008', 'DD/MM/YYYY') n' aucun sens puisque '30/07/2008' est déjà une chaîne de caractère.

Remarque importante : il est plus propre quand tu compares des dates, d'utiliser la fonction trunc qui conserve le format date mais qui tronque à la précision demandée.

Ainsi la requête suivante revient au même que ta première requête :
Code :
SELECT * FROM ma_table WHERE trunc(champ_date, 'DD') = trunc(sysdate, 'DD');
L'avantage est que tu peux faire des calculs sur des dates, ce que tu ne peux pas faire avec un to_char.
__________________
Un problème sans solution est un problème mal posé

Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2008, 14h08   #14
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : Conseil

Informations forums :
Inscription : janvier 2004
Messages : 2 866
Points : 3 448
Points : 3 448
Citation:
Envoyé par LeoAnderson Voir le message
Code :
SELECT * FROM ma_table WHERE champ_date = to_date ('30/04/1985', 'DD/MM/YYYY')
Attention, si les dates sont stockées avec les heures cela ne fonctionne pas
__________________
Un problème sans solution est un problème mal posé

Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2008, 14h12   #15
Membre actif
 
Inscription : avril 2007
Messages : 483
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : avril 2007
Messages : 483
Points : 189
Points : 189
Oki oki, en effet ça marche.

Mais donc cela voudrait dire que le sysdate lors de l'insert est convertit automatiquement au format date ? si c'est le cas j'aurai donc (si j'ai bien compris) tout le temps à faire ce cette façon lors des select (c-a-d champ_date = to_date(ma date, format) ).
Sh4dow49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2008, 14h15   #16
Membre actif
 
Inscription : avril 2007
Messages : 483
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : avril 2007
Messages : 483
Points : 189
Points : 189
En effet avec les heures il retourne une erreur ...

Et si je modifiais ma requête insert pour qu'il y ai un système de select qui fonctionne à coup sur ? comment devrais-je insérer mon sysdate dans le champ date ?
Sh4dow49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2008, 14h25   #17
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : Conseil

Informations forums :
Inscription : janvier 2004
Messages : 2 866
Points : 3 448
Points : 3 448
Citation:
Envoyé par Sh4dow49 Voir le message
Mais donc cela voudrait dire que le sysdate lors de l'insert est convertit automatiquement au format date ?
SYSDATE est un fonction qui renvoie une date. Comme toutes les dates oracle, elle contient les jours, mois, années, heures, minutes, secondes
__________________
Un problème sans solution est un problème mal posé

Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.
plaineR 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 04h50.


 
 
 
 
Partenaires

Hébergement Web