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 18/12/2007, 11h39   #1
Invité de passage
 
Inscription : février 2007
Messages : 2
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 2
Points : 1
Points : 1
Par défaut ORA-01841: year must be between -4713 and +9999

Bonjour à tous,

je suis coincée sur la requête que voici (sous Oracle 9):
Code :
1
2
3
4
5
6
SELECT   TO_DATE (char_content, 'YYYY')
FROM tb_content, tb_topic
WHERE tb_content.topic_id = tb_topic.ID
AND topic_code = 'RP_DET_END_DATE'
AND TO_DATE (char_content, 'YYYY') < TO_DATE ('2007', 'YYYY')
ORDER BY char_content
J'obtiens l'erreur suivante : "ORA-01841: (full) year must be between -4713 and +9999", and not be 0"

Les "char_content" filtrés grâce à 'topic_code=...' sont des VARCHAR non nuls allant de '2003' à '9999'.
Si j'enlève la clause "AND TO_DATE...", je n'ai pas d'erreur, il m'affiche bien des dates type :
"01/12/2003
01/12/2003
01/12/2004"
De même, si dans la clause "AND TO_DATE" je remplace char_content par '2003' ou '9999' par exemple, ça marche.
Et je n'ai aucun espace ou autre caractère superflu dans un des char_content.

Cela vous dit-il quelque chose ?
nathbot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2007, 12h15   #2
Membre actif
 
Avatar de Loyd1974
 
Inscription : août 2007
Messages : 176
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 176
Points : 172
Points : 172
Vu que tu dis obtenir des dates sous la forme :
Code :
1
2
3
 "01/12/2003
01/12/2003
01/12/2004"
J'ai l'impression que ton champ char_content est de la forme 'DD/MM/YYYY'
donc, lorsque tu fais :
Code :
1
2
3
4
 
TO_DATE(char_content, 'YYYY')
ca revient à faire
TO_DATE('01/12/2007','YYYY')
et du coup, cela ne marche pas
Et je pense que la conversion au format date n'est pas très utile, et qu'une simple comparaison de charactères suffira
donc, tu auras:
Code :
1
2
3
4
5
6
7
SELECT   TO_DATE (char_content, 'DD/MM/YYYY')
FROM tb_content, tb_topic
WHERE tb_content.topic_id = tb_topic.ID
AND topic_code = 'RP_DET_END_DATE'
AND SUBSTR(char_content,7,4) < '2007'
ORDER by char_content
Autre chose, au niveau de ton order by, tu le fais au niveau d'un champ caractères, donc, tu vas obtenir l'ordre suivant :
01/01/2007
01/02/2005
01/03/2006
02/01/2005
02/02/2007
Il vaut mieux faire un ORDER BY sur la date, en précisant la position de ta colonne (dans le cas présent, ORDER BY 1) ou bien sur la colonne convertit en date (ORDER BY
TO_DATE (char_content, 'DD/MM/YYYY'))
Loyd1974 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2007, 12h39   #3
Invité de passage
 
Inscription : février 2007
Messages : 2
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 2
Points : 1
Points : 1
Citation:
Envoyé par Loyd1974 Voir le message
Vu que tu dis obtenir des dates sous la forme :
Code :
1
2
3
 "01/12/2003
01/12/2003
01/12/2004"
J'ai l'impression que ton champ char_content est de la forme 'DD/MM/YYYY'
Non char_content est bien un nombre de 4 chiffres à chaque fois.
Mais la bonne nouvelle, c'est qu'en faisant un peu comme tu as dit :
Code :
1
2
3
4
5
SELECT   TO_DATE (char_content, 'YYYY')
FROM tb_content, tb_topic
WHERE tb_content.topic_id = tb_topic.ID
AND topic_code = 'RP_DET_END_DATE'
AND char_content < '2007'
ça marche ! Ce qui est étrange, j'étais persuadée d'avoir essayé ça en premier mais bon j'ai dû faire un détail différent...
Autre étrangeté, TOAD m'affiche encore
"01/12/2003
01/12/2003
01/12/2004
..."
Va comprendre ! Mais bon, pour ce que je veux faire de cette requête, ça ne sera pas gênant.
Merci pour ton aide en tout cas !
nathbot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2007, 13h57   #4
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 453
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 453
Points : 4 215
Points : 4 215
un to_date(annee, 'YYYY') va te ramener le premier jour du mois actuel.
Equivalent à
Code :
1
2
SELECT TO_DATE('01/'|| TO_CHAR(SYSDATE,'MM')||'/'||annee,'DD/MM/YYYY')
FROM dual
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h32.


 
 
 
 
Partenaires

Hébergement Web