Requete between avec champs texte [Résolu]

microraph 24 Messages postés dimanche 21 octobre 2007Date d'inscription 18 mai 2010 Dernière intervention - 16 mai 2010 à 16:46 - Dernière réponse : microraph 24 Messages postés dimanche 21 octobre 2007Date d'inscription 18 mai 2010 Dernière intervention
- 18 mai 2010 à 17:46
Bonjour,

je possède une table access avec un champs nommé DATE_PERIODE sous la forme AAAAMMJJ

++++++++++++++++++++
+ ID + DATE_PERIODE
+ 1 + 20040505
+ 2 + 20090504
+ 3 + 20070403
etc...

et j'aimerais effectuer un SELECT * FROM maTable WHERE DATE_PERIODE BETWEEN @Debut AND @Fin
@Debut ; @Fin ; deux paramètres passés à la commande.

Le problème est que Between ne fonctionne pas, comment puis-je faire?
Convertir la date sous la forme JJ/MM/AAAA ?

Merci a tous.
Afficher la suite 

Votre réponse

20 réponses

microraph 24 Messages postés dimanche 21 octobre 2007Date d'inscription 18 mai 2010 Dernière intervention - 18 mai 2010 à 15:27
+3
Utile
Bon j'ai réussi a trouvé la solution et là ça fonctionne :

j'ai pris ce code :
int iDebutPeriode= Convert.ToInt32(sDebutPeriode);
int iFinPeriode= Convert.ToInt32(sFinPeriode); 


et l'ai mis en paramètre directement dans ma requête avec des simple quotte :
oCommand.CommandText = "INSERT INTO tblDonneesAImporter SELECT * FROM tblDonneesCPU WHERE (DATE_PERIODE BETWEEN '"+iDebutPeriode+"' AND '"+iFinPeriode+"')";



Merci a vous deux pour votre aide.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de microraph
Tilois 721 Messages postés dimanche 10 juin 2001Date d'inscription 27 mars 2011 Dernière intervention - 16 mai 2010 à 17:27
0
Utile
Il suffit de convertir le champ de la table en entier.
Si tes deux paramètres sont des entiers également, tout devrait rentrer dans l'ordre.

Bonne journée
Commenter la réponse de Tilois
microraph 24 Messages postés dimanche 21 octobre 2007Date d'inscription 18 mai 2010 Dernière intervention - 16 mai 2010 à 17:46
0
Utile
En fait, dans ma table la date_periode est un varchar(20),
mes paramètres, sont récupérés via deux textbox donc un string.

Tu penses qu'un simple Convert.ToInt32 ferrait l'affaire?
Commenter la réponse de microraph
Tilois 721 Messages postés dimanche 10 juin 2001Date d'inscription 27 mars 2011 Dernière intervention - 16 mai 2010 à 18:28
0
Utile
si tu mets tout en entier oui, attention il faut que DATE_PERIODE soit aussi en entier.
N'oublie pas de tester tes paramètres quand tu passes du textbox à la variable
Commenter la réponse de Tilois
microraph 24 Messages postés dimanche 21 octobre 2007Date d'inscription 18 mai 2010 Dernière intervention - 17 mai 2010 à 11:13
0
Utile
salut. MErci pour ta réponse mais ça ne fonctionne pas. J'ai attribué à deux variable
int iDebutper = Convert.ToInt32(sDebutPeriode);
int iFinper = Convert.ToInt32(sFinPeriode);

J'ai essayer deux méthode, qui toutes les deux devraient fonctionner :
1ere méthode :
oCommand.CommandText = "INSERT INTO tblDonneesAImporter SELECT * FROM tblDonneesCPU WHERE DATE_PERIODE BETWEEN @DebutPeriode AND @FinPeriode";
oCommand.Parameters.AddWithValue("@DebutPeriode", iDebutPer);
oCommand.Parameters.AddWithValue("@FinPeriode", iFinPer);
oCommand.ExecuteNonQuery();

2eme méthode :
oCommand.CommandText = "INSERT INTO tblDonneesAImporter SELECT * FROM tblDonneesCPU WHERE DATE_PERIODE > @DebutPeriode AND DATE_PERIODE < @FinPeriode";
oCommand.Parameters.AddWithValue("@DebutPeriode", iDebutPer);
oCommand.Parameters.AddWithValue("@FinPeriode", iFinPer);
oCommand.ExecuteNonQuery();

Résultat, il me sort les dates avant, après mais pas celle comprise dans la période données.

Autre chose, j'extrait mes données d'un fichier CSV dans une base Access (*.mdb), et je n'arrive pas à lui dire que "DATE_PERIODE" doit est un int, il n'accepte que varchar dans la requete CREATE TABLE. C'est normal ?

Merci.
Commenter la réponse de microraph
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 17 mai 2010 à 16:11
0
Utile
Salut

Voici 2 méthodes (j'en utilise une pour chaque date)

// On passe au format jj/mm/aaaa
// Grâce à la méthode Substring
string sDate1 = sDebutPeriode.Substring(6, 2) + "/" + sDebutPeriode.Substring(4, 2) + "/" + sDebutPeriode.Substring(0, 4);
// On utilise la fonction DateTime.Parse
DateTime date1 = DateTime.Parse(sDate1);

// Autre solution, on utilise le constructeur de DateTime
// Et on utilise la méthode Substring pour découper la chaine
// Puis Convert.ToInt32 pour passer la chaine en int
DateTime date2 = new DateTime(Convert.ToInt32(sFinPeriode.Substring(0, 4)), Convert.ToInt32(sFinPeriode.Substring(4, 2)), Convert.ToInt32(sFinPeriode.Substring(6, 2)));

oCommand.CommandText = "INSERT INTO tblDonneesAImporter SELECT * FROM tblDonneesCPU WHERE DATE_PERIODE BETWEEN @DebutPeriode AND @FinPeriode"; 
oCommand.Parameters.Add(new SqlParameter("@DebutPeriode", date1));
oCommand.Parameters.Add(new SqlParameter("@FinPeriode", date2));

// Blablabla j'exécute ma requête blablabla


Attention que je crois (pas sûr) que SQL Server n'accepte pas les requêtes INSERT INTO table SELECT requete

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Commenter la réponse de krimog
microraph 24 Messages postés dimanche 21 octobre 2007Date d'inscription 18 mai 2010 Dernière intervention - 17 mai 2010 à 16:17
0
Utile
en fait j'ai fait et je fais encore des tests pour essayer de comprendre pourquoi la commande ça ne fonctionne pas, j'ai essayer tout simplement d'extraire la date correspondante à DebutPeriode (passée en paramètre) :

oCommand.CommandText "INSERT INTO tblDonneesAImporter SELECT * FROM tblDonneesCPU WHERE DATE_PERIODE @DebutPeriode";

et celà échoue, par contre si je modifie ma requête :
oCommand.CommandText "INSERT INTO tblDonneesAImporter SELECT * FROM tblDonneesCPU WHERE DATE_PERIODE 'ma_date';

cela fonctionne si je passe en argument le chiffre de ma date.

Via une constante c'est bon, mais une variable pas, normal ou pas ?

merci.
Commenter la réponse de microraph
microraph 24 Messages postés dimanche 21 octobre 2007Date d'inscription 18 mai 2010 Dernière intervention - 17 mai 2010 à 16:20
0
Utile
Pour répondre à krimog,

moi mes dates sont d'un format un peu bizarre puisqu'elle sont dans mon fichier csv, et dans ma table access créée a partir de ce même fichier sous la forme AAAAMMJJ.
(ex: 20100517)
Donc si j'effectue un between Debut_periode and Fin_periode, logiquement ça devrait passé, mais ça veut pas, même en convertissant en int voire en uint rien n'y fait
Commenter la réponse de microraph
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 17 mai 2010 à 16:55
0
Utile
Mais, outre la façon dont ça s'affiche, quel est le type du champ DATE_PERIODE ? text, varchar, datetime, timestamp... ?

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Commenter la réponse de krimog
microraph 24 Messages postés dimanche 21 octobre 2007Date d'inscription 18 mai 2010 Dernière intervention - 17 mai 2010 à 17:09
0
Utile
c'est du type varchar de taille (20)
Commenter la réponse de microraph
Tilois 721 Messages postés dimanche 10 juin 2001Date d'inscription 27 mars 2011 Dernière intervention - 17 mai 2010 à 17:15
0
Utile
il faut convertir ta date de départ.
en sql server cela donnerait un truc du genre:
SELECT * FROM tblDonneesCPU WHERE CONVERT(INTEGER, DATE_PERIODE) BETWEEN @DebutPeriode AND @FinPeriode
Commenter la réponse de Tilois
microraph 24 Messages postés dimanche 21 octobre 2007Date d'inscription 18 mai 2010 Dernière intervention - 17 mai 2010 à 18:31
0
Utile
La méthode proposée sur les sites pour Access, on trouve quelque chose de similaire :
oCommand.CommandText "INSERT INTO tblDonneesAImporter SELECT * FROM tblDonneesCPU WHERE DATE_PERIODE CInt(@DebutPeriode)";

mais cela ne fonctionne pas.

EN fait, ce que tu me propose rejoint la conversion un peu plus haut, avec Convert.ToInt32(sDebutPeriode); ?
Commenter la réponse de microraph
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 17 mai 2010 à 18:44
0
Utile
@microraph : Il faut que les 2 parties soient converties en int.

Tu dois donc transmettre tes paramètres en int
oCommand.Parameters.Add(new SqlParameter("@DebutPeriode", Convert.ToInt32(sDebutPeriode));


Mais également le champ DATE_PERIODE avec lequel tu fais la comparaison (qui est un varchar).
oCommand.CommandText = "INSERT INTO tblDonneesAImporter SELECT * FROM tblDonnees CPU WHERE CInt(DATE_PERIODE) BEWTEEN @DebutPeriode AND @FinPeriode";


Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Commenter la réponse de krimog
microraph 24 Messages postés dimanche 21 octobre 2007Date d'inscription 18 mai 2010 Dernière intervention - 17 mai 2010 à 19:09
0
Utile
J'ai mis ton code dans le mien :

oCommand.CommandText = "INSERT INTO tblDonneesAImporter SELECT * FROM tblDonneesCPU WHERE CInt(DATE_PERIODE) BETWEEN @DebutPeriode AND @FinPeriode";

oCommand.Parameters.Add(new OleDbParameter("@DebutPeriode", Convert.ToInt32(sDebutPeriode)));
oCommand.Parameters.Add(new OleDbParameter("@FinPeriode", Convert.ToInt32(sFinPeriode)));


Donc j'obtiens cette erreur:
Exception OleDbException
Type de données incompatible dans l'expression du critère.

C'est probablement le CInt...
Commenter la réponse de microraph
microraph 24 Messages postés dimanche 21 octobre 2007Date d'inscription 18 mai 2010 Dernière intervention - 17 mai 2010 à 22:06
0
Utile
DOnc maintenant, je n'ai plus cette erreur,

dans ma commande CREATE TABLE pour la colonne DATE_PERIODE je luia imis comme type INTEGER

Ensuite, j'ai mis
oCommand.CommandText = "INSERT INTO tblDonneesAImporter SELECT * FROM tblDonneesCPU WHERE DATE_PERIODE BETWEEN @DebutPeriode AND @FinPeriode";
oCommand.Parameters.AddWithValue("@DebutPeriode", sDebutPeriode); 
oCommand.Parameters.AddWithValue("@FinPeriode", sFinPeriode);


L'exécution fonction mais si je rentre DebutPeriode 20080202 et FinPeriode 20090305 ; le résultat que j'ai après c'est en plus des deux valeurs Debut et Fin, j'obtiens des valeurs hors de la période. C'est bizarre non? MAis lié à quoi ?

mercI.
Commenter la réponse de microraph
microraph 24 Messages postés dimanche 21 octobre 2007Date d'inscription 18 mai 2010 Dernière intervention - 18 mai 2010 à 09:53
0
Utile
Bonjour a vous.

Donc aujourd'hui, j'ai essayer au lieu de passer par des paramètres, je met des valeurs fixe dans ma requête :
oCommand.CommandText = "INSERT INTO tblDonneesAImporter SELECT * FROM tblDonneesCPU WHERE DATE_PERIODE BETWEEN '20080109' AND '20090514'";


et là, la génération fonctionne sans problème. Cependant, en passant par des paramètres cela pose problème alors que mes paramètres sont en 'Int'.
Commenter la réponse de microraph
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 18 mai 2010 à 10:08
0
Utile
D'un autre côté, ça ne m'étonne pas. Access a une syntaxe SQL propre à lui-même. Il ne respecte pas les standards. Personnellement, je préfère largement utiliser SQLite si je veux une base dans un fichier.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Commenter la réponse de krimog
microraph 24 Messages postés dimanche 21 octobre 2007Date d'inscription 18 mai 2010 Dernière intervention - 18 mai 2010 à 10:31
0
Utile
D'accord sur ce point, mais ce SGBD à été imposé, donc voilà c'est très énervant quand ça fonctionne pas.
Si je lui donne BETWEEN Debut AND Fin, il me sors tout sauf ce qui est dans la période.
Si je lui donne BETWEEN Fin AND Debut, il me sors tout - donc ok.
Si je lui donne Supérieur à Debut, il pose problème :)
Commenter la réponse de microraph
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 18 mai 2010 à 16:35
0
Utile
Avec des quotes autour d'int ?
Bon...

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Commenter la réponse de krimog
microraph 24 Messages postés dimanche 21 octobre 2007Date d'inscription 18 mai 2010 Dernière intervention - 18 mai 2010 à 17:46
0
Utile
Ouaip ^^ Tant que ça fonctionne, pourquoi pas. :)
Commenter la réponse de microraph

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.