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 16/01/2012, 12h15   #1
Membre régulier
 
Homme Nicolas
Étudiant
Inscription : mai 2010
Messages : 309
Détails du profil
Informations personnelles :
Nom : Homme Nicolas
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2010
Messages : 309
Points : 74
Points : 74
Par défaut Format de données DATE

Bonjour,

je dois récupérer des informations à partir de leur date.
La formule relative à ces dates est la suivante : A un jour J, on récupère les infos depuis J-8 de l'année N-1 jusqu'au jour J-8 de l'année N.

Un des problèmes étant que le format "date" de la table est en VARCHAR2, de type 20110101 010101 pour : 1er janvier 2011 à 1h, 1min et 1s.

Donc j'ai essayé ça déjà :

Code :
1
2
 
SELECT sysdate-interval '1' year - interval '8' day FROM dual;
avec ceci je récupère la valeur J-8 de l'année N-1, sous un format DATE normal.

Ensuite,
Code :
1
2
3
4
 
SELECT to_char(to_date(substr(<champDate>,1,8), 'YYYYMMDD') - interval '1' year - interval '8' day, 'YYYYMMDD HH24MISS') AS nouvelleDate
FROM nomTable, dual
WHERE nouvelleDate < <champDate> <= to_char(sysdate - interval '8' day, 'YYYYMMDD HH24DDSS');
Donc, le substr sert à récupérer uniquement la partie intéressante , jour + mois + année.

Et ensuite j'avoue qu'avec toutes ces parenthèses, j'ai du mal à m'y retrouver.
Surtout que j'ai un message d'erreur :
Citation:
ORA-00933 :
La commande SQL ne se termine pas correctement
Donc, j'aimerais bien savoir si ma méthode semble/est bonne et s'il y a moyen de l'améliorer ?

Merci
feldi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 12h33   #2
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 446
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 446
Points : 7 546
Points : 7 546
Code :
WHERE nouvelleDate < <champDate> <= to_char(sysdate - interval '8' day, 'YYYYMMDD HH24DDSS')
Il y a une erreur dans cette expression.

Il faut l'écrire sous la forme de deux expressions de comparaison :
Code :
1
2
WHERE   nouvelleDate < <champDate> 
    AND <champDate> <= to_char(sysdate - interval '8' day, 'YYYYMMDD HH24DDSS')
Ensuite, l'utilisation de dual en produit cartésien avec une autre table est totalement inutile.
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/01/2012, 12h46   #3
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 687
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 687
Points : 10 442
Points : 10 442
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Interval il ne faut pas l'utiliser en soustraction car il n'est pas intelligent sur les années bissextiles :
Code :
1
2
3
4
SELECT date '2012-02-29' - interval '1' year AS dt
  FROM dual;
 
-- ORA-01839: le quantième n'est pas valide pour le mois indiqué
Pour vos données, je vous conseille de modifier votre table et d'utiliser un type date.

En attendant :
Code :
1
2
3
SELECT <vos colonnes>
  FROM nomTable
 WHERE to_date(<champDate>, 'YYYYMMDD HH24MISS') BETWEEN add_months(sysdate - 8, -12) AND sysdate - 8;
__________________
Email : http://scr.im/waldar
Waldar est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/01/2012, 13h34   #4
Membre régulier
 
Homme Nicolas
Étudiant
Inscription : mai 2010
Messages : 309
Détails du profil
Informations personnelles :
Nom : Homme Nicolas
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2010
Messages : 309
Points : 74
Points : 74
Citation:
Envoyé par al1_24 Voir le message
Il y a une erreur dans cette expression.
Ensuite, l'utilisation de dual en produit cartésien avec une autre table est totalement inutile.
OK merci pour les précisions !

Citation:
Envoyé par Waldar Voir le message
Interval il ne faut pas l'utiliser en soustraction car il n'est pas intelligent sur les années bissextiles :

Pour vos données, je vous conseille de modifier votre table et d'utiliser un type date.
En attendant :
Code :
1
2
3
SELECT <vos colonnes>
  FROM nomTable
 WHERE to_date(<champDate>, 'YYYYMMDD HH24MISS') BETWEEN add_months(sysdate - 8, -12) AND sysdate - 8;
ça serait trop simple de modifier la structure et prendre un vrai champ date
Je dois me contenter de ce varchar2.

J'obtiens un résultat avec vos modifs, mais pas celui attendu (format bizarre).
Je vais essayer quelques modifs sur le format pour essayer d'avoir le bon.

Merci à vous deux.
feldi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 14h56   #5
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 687
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 687
Points : 10 442
Points : 10 442
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Citation:
Envoyé par feldi Voir le message
J'obtiens un résultat avec vos modifs, mais pas celui attendu (format bizarre).
Je n'ai rien mis dans le select !
__________________
Email : http://scr.im/waldar
Waldar est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 16h35   #6
Membre régulier
 
Homme Nicolas
Étudiant
Inscription : mai 2010
Messages : 309
Détails du profil
Informations personnelles :
Nom : Homme Nicolas
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2010
Messages : 309
Points : 74
Points : 74
Citation:
Envoyé par Waldar Voir le message
Je n'ai rien mis dans le select !
J'avais adapté ta requête à mon besoin avant de l'éxécuter
feldi 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 16h11.


 
 
 
 
Partenaires

Hébergement Web