Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels 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 13/04/2007, 13h43   #1
Futur Membre du Club
 
Inscription : avril 2006
Messages : 98
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 98
Points : 16
Points : 16
Par défaut Pourquoi le code ora-01861 ?

Bonjour à toutes et à tous,

Je n'arrive pas à trouver la solution, je fais un blocage

Je cherche à connaître les nouveaux joueurs à une date, dans l'exemple le 27032007. Les joueurs ne doivent donc pas exister avant le 27032007 !

Avec d'autres requêtes du style where date like '%20070327%', cela fonctionne correctement et ici non ?

De plus il faudrait que je puisse saisir une date sous la forme DDMMYYYY et que cela fonctionne malgré le format de jdaval dans la bae YYYYMMDD.


Les variables :

nomutilisateur = dupont8976
ladate = date (dans la base sous la forme YYYYMMDD)


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
SQL> SET LINESIZE 150
SQL> SET PAGESIZE 150
SQL> SELECT D1.nomutilisateur,D1.date,
  2  count(DISTINCT D1.nomutilisateur) over()
  3  FROM tm1genval D1
  4  WHERE ladate >=to_date('20070327','YYYYMMDD')
  5  AND ladate <to_date('20070327','YYYYMMDD')+1
  6  AND NOT EXISTS (SELECT 1 FROM tm1genval D2
  7  WHERE D2.nomutilisateur=D1.nomutilisateur 
  8  AND ladate < to_date('20070327','YYYYMMDD'));
WHERE ladate >=to_date('20070327','YYYYMMDD')
      *
ERROR at line 4:
ORA-01861: literal does NOT match format string
Merci encore pour votre aide.

Cordialement.
dauphin34000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2007, 14h16   #2
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
Le nom "date" est réservé non ?
essaye de mettre l'alias de la table devant.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2007, 14h29   #3
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
Non, en fait faut mettre d."date"
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2007, 14h56   #4
Futur Membre du Club
 
Inscription : avril 2006
Messages : 98
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 98
Points : 16
Points : 16
Citation:
Envoyé par McM
Non, en fait faut mettre d."date"
Le problème ne vient pas de date, j'ai changer la variable en ladate, j'ai toujours ERROR ORA-1861.

Qui va donc trouver la solution ?

Merci pour votre aide.
dauphin34000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2007, 15h32   #5
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Salut,

Est ce que ton champs ladate est obligatoire ( not null)?

Si c'est facultatif rajoute dans ton code ladate is not null

J'ai trouvé cet article sur Metalink
Code :
1
2
3
4
5
6
7
 
Description
 
 
Implicit DATA conversion FROM NULL terminated string host variable 
TO date, results IN ORA-1861 'literal does not match format string'
IF the TABLE IS locked.
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2007, 16h02   #6
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
Pfff.. j'avais pas lu en entier la question posée :
Citation:
ladate = date (dans la base sous la forme YYYYMMDD)
et
Avec d'autres requêtes du style where date like '%20070327%', cela fonctionne correctement
C'est quoi le type du champ ladate ? VARCHAR2 ou DATE ??
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2007, 16h04   #7
Futur Membre du Club
 
Inscription : avril 2006
Messages : 98
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 98
Points : 16
Points : 16
Citation:
Envoyé par salim11
Salut,

Est ce que ton champs ladate est obligatoire ( not null)?

Si c'est facultatif rajoute dans ton code ladate is not null

J'ai trouvé cet article sur Metalink
Code :
1
2
3
4
5
6
7
 
Description
 
 
Implicit DATA conversion FROM NULL terminated string host variable 
TO date, results IN ORA-1861 'literal does not match format string'
IF the TABLE IS locked.
Salut et merci pour ton aide,

le champs dans ma base pour ladate is not null. Donc il y a obligatoirement une date.

Comment peut-on faire d'après vous ?
dauphin34000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2007, 16h12   #8
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Salut,

Quand tu fais un select , quel est le format du champs ladate (yyyymmdd)?
Code :
1
2
3
 
SELECT  DISTINCT ladate 
     FROM tm1genval D1
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2007, 16h24   #9
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Salut,

Tu peux poster le script de création de ta table tm1genval ?
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2007, 16h32   #10
Futur Membre du Club
 
Inscription : avril 2006
Messages : 98
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 98
Points : 16
Points : 16
Citation:
Envoyé par McM
Pfff.. j'avais pas lu en entier la question posée :


C'est quoi le type du champ ladate ? VARCHAR2 ou DATE ??
C'est plus que sympa votre aide !

Je viens de vérifier, le champ ladate est du type varchar2(10) et non pas date !

C'est pour cette raison que cela ne fonctionne pas ?

Comment peut-on faire alors ??

Merci à vous.
dauphin34000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2007, 16h35   #11
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Salut,

Il faut le convertir aussi
Code :
1
2
3
4
5
6
7
8
9
 
SELECT D1.nomutilisateur,D1.date,
  2  count(DISTINCT D1.nomutilisateur) over()
  3  FROM tm1genval D1
  4  WHERE to_date(ladate ,'YYYYMMDD') >=to_date('20070327','YYYYMMDD')
  5  AND to_date(ladate ,'YYYYMMDD')<to_date('20070327','YYYYMMDD')+1
  6  AND NOT EXISTS (SELECT 1 FROM tm1genval D2
  7  WHERE D2.nomutilisateur=D1.nomutilisateur 
  8  AND to_date(ladate ,'YYYYMMDD')< to_date('20070327','YYYYMMDD'))
mais pourquoi pas varchar2(8)tu as le format 'YYYYMMDD'?
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2007, 16h48   #12
Futur Membre du Club
 
Inscription : avril 2006
Messages : 98
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 98
Points : 16
Points : 16
Citation:
Envoyé par salim11
Salut,

Il faut le convertir aussi
Code :
1
2
3
4
5
6
7
8
9
 
SELECT D1.nomutilisateur,D1.date,
  2  count(DISTINCT D1.nomutilisateur) over()
  3  FROM tm1genval D1
  4  WHERE to_date(ladate ,'YYYYMMDD') >=to_date('20070327','YYYYMMDD')
  5  AND to_date(ladate ,'YYYYMMDD')<to_date('20070327','YYYYMMDD')+1
  6  AND NOT EXISTS (SELECT 1 FROM tm1genval D2
  7  WHERE D2.nomutilisateur=D1.nomutilisateur 
  8  AND to_date(ladate ,'YYYYMMDD')< to_date('20070327','YYYYMMDD'))
mais pourquoi pas varchar2(8)tu as le format 'YYYYMMDD'?

Super cela fonctionne à un détail prés, j'ai bien le résultat mais par contre il m'indique 129 enregistrements en m'indiquant plusieurs fois par exemple le même utilisateur pour la même journée donc cela fait pour la date du 20070327
129 enregistrements, alors qu'il devrait me dire et me présenter à l'écran que 19 nouveaux utilisateurs au 20070327, ils n'existaient pas avant, nous sommes bien d'accord !

Si tu peux trouver la solution, tu es vraiment un "client" en oracle, bravo et merci.

Pour le vachar2(10), je sais c'est bizarre, mais je ne connais pas les responsables
dauphin34000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2007, 16h50   #13
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
Citation:
Envoyé par salim11
Salut,

Il faut le convertir aussi
Ben non justement faut pas le convertir vu que c'est du YYYYMMDD c'est trié.
Faut le convertir si tu dois faire des calculs de date (genre le +1)
Code :
1
2
3
4
5
6
7
8
 
SELECT D1.nomutilisateur,D1.date,
    count(DISTINCT D1.nomutilisateur) over()
    FROM tm1genval D1
    WHERE SUBSTR(ladate,1,8) =  '20070327'  
    AND NOT EXISTS (SELECT 1 FROM tm1genval D2
    WHERE D2.nomutilisateur=D1.nomutilisateur 
    AND ladate < '20070327')
c'est con d'avoir du VCHR(10), ce serait 8 comme le dit Salim, tu peux alors t'affranchir du SUBSTR et donc avoir un index utilisé( ou alors si tu es sur que les données seront toujours de length 8, pas de substr)
Dans ce cas je préconise un alter table pour repasser en VARCHAR2(8)
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2007, 16h53   #14
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
salut,
rajoute un Distinct
Code :
1
2
3
4
5
6
7
8
9
 
SELECT  DISTINCT D1.nomutilisateur,D1.date,
  2  count(DISTINCT D1.nomutilisateur) over()
  3  FROM tm1genval D1
  4  WHERE to_date(ladate ,'YYYYMMDD') >=to_date('20070327','YYYYMMDD')
  5  AND to_date(ladate ,'YYYYMMDD')<to_date('20070327','YYYYMMDD')+1
  6  AND NOT EXISTS (SELECT 1 FROM tm1genval D2
  7  WHERE D2.nomutilisateur=D1.nomutilisateur 
  8  AND to_date(ladate ,'YYYYMMDD')< to_date('20070327','YYYYMMDD'))
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2007, 17h05   #15
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Salut ,

Oui c'est vrai pourquoi ce code pour selectionner une journée
Code :
1
2
3
 
to_date(ladate ,'YYYYMMDD') >=to_date('20070327','YYYYMMDD')
  5  AND to_date(ladate ,'YYYYMMDD')<to_date('20070327','YYYYMMDD')+1
Tu as raison MCM , des fois je voix pas bien
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2007, 17h37   #16
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
Code :
1
2
3
4
5
6
7
8
9
10
SELECT D1.nomutilisateur, 
	   '20070327' AS ladate, 
	   COUNT(DISTINCT D1.nomutilisateur) over()
FROM tm1genval D1
WHERE ladate = '20070327'
AND NOT EXISTS (SELECT 1 
		FROM tm1genval D2
		WHERE D2.nomutilisateur = D1.nomutilisateur 
		AND ladate < '20070327')
GROUP BY D1.nomutilisateur
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2007, 18h06   #17
Futur Membre du Club
 
Inscription : avril 2006
Messages : 98
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 98
Points : 16
Points : 16
Citation:
Envoyé par salim11
Salut ,

Oui c'est vrai pourquoi ce code pour selectionner une journée
Code :
1
2
3
 
to_date(ladate ,'YYYYMMDD') >=to_date('20070327','YYYYMMDD')
  5  AND to_date(ladate ,'YYYYMMDD')<to_date('20070327','YYYYMMDD')+1
Tu as raison MCM , des fois je voix pas bien
Merci pour votre aide Messieurs, j'avais un grand besoin d'experts.

Je ne peux pas tester, il faudra attendre lundi

Concernant la deuxième ligne c'est pour faire pour une tranche de date !

Bon week-end à vous

Je ferme le sujet si cela tourne lundi
dauphin34000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2007, 10h02   #18
Futur Membre du Club
 
Inscription : avril 2006
Messages : 98
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 98
Points : 16
Points : 16
Citation:
Envoyé par McM
Code :
1
2
3
4
5
6
7
8
9
10
SELECT D1.nomutilisateur, 
	   '20070327' AS ladate, 
	   COUNT(DISTINCT D1.nomutilisateur) over()
FROM tm1genval D1
WHERE ladate = '20070327'
AND NOT EXISTS (SELECT 1 
		FROM tm1genval D2
		WHERE D2.nomutilisateur = D1.nomutilisateur 
		AND ladate < '20070327')
GROUP BY D1.nomutilisateur

Salut à tous,

Je viens de "tester" le script sql (ci-dessus), il est parfait , Grandissimo !

Lorsque les "experts" sont dans le coin, cela se voit

Un grand merci à vous pour votre aide.

Allez pour la route, je sais que vous êtes "chaud", si je veux faire la même chose mais pour une tranche de date (exemple les nouveaux du 20070327 au 20070330) inclus, je modifie comment le code ? afin que je ne fasse pas une bétisse.

Bonne journée les "pros".

Cordialement.
dauphin34000 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 16/04/2007, 10h14   #19
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
Tant que tu n'as pas de calcul sur les date (du genre du 20070327 au 20070327 + 7 jours), tu peux continuer à garder ce format.
Bien sur faut modifier le groupement vu que tu auras plusieurs dates (enfin ça dépend de ce que tu veux en sortie)
Code :
1
2
3
4
5
6
7
8
9
10
SELECT nomutilisateur, 
	   ladate, 
	   COUNT(DISTINCT nomutilisateur) over()
FROM tm1genval D1
WHERE ladate NETWEEN '20070327' AND '20070330'
AND NOT EXISTS (SELECT 1 
		FROM tm1genval D2
		WHERE D2.nomutilisateur = D1.nomutilisateur 
		AND ladate < '20070327')
GROUP BY nomutilisateur, ladate
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2007, 10h30   #20
Futur Membre du Club
 
Inscription : avril 2006
Messages : 98
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 98
Points : 16
Points : 16
Citation:
Envoyé par McM
Tant que tu n'as pas de calcul sur les date (du genre du 20070327 au 20070327 + 7 jours), tu peux continuer à garder ce format.
Bien sur faut modifier le groupement vu que tu auras plusieurs dates (enfin ça dépend de ce que tu veux en sortie)
Code :
1
2
3
4
5
6
7
8
9
10
SELECT nomutilisateur, 
	   ladate, 
	   COUNT(DISTINCT nomutilisateur) over()
FROM tm1genval D1
WHERE ladate NETWEEN '20070327' AND '20070330'
AND NOT EXISTS (SELECT 1 
		FROM tm1genval D2
		WHERE D2.nomutilisateur = D1.nomutilisateur 
		AND ladate < '20070327')
GROUP BY nomutilisateur, ladate

Cela fonctionne parfaitement bien

McM, tu es le roi d'oracle , je te remercie vraiement beaucoup pour ton aide.

Quel chance de t'avoir trouvé sur la route de la connaissance !

Cordialement

Bonne journée.
dauphin34000 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 13h33.


 
 
 
 
Partenaires

Hébergement Web