Requete between avec champs texte

Résolu
microraph Messages postés 24 Date d'inscription dimanche 21 octobre 2007 Statut Membre Dernière intervention 18 mai 2010 - 16 mai 2010 à 16:46
microraph Messages postés 24 Date d'inscription dimanche 21 octobre 2007 Statut Membre Dernière intervention 18 mai 2010 - 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.

20 réponses

microraph Messages postés 24 Date d'inscription dimanche 21 octobre 2007 Statut Membre Dernière intervention 18 mai 2010
18 mai 2010 à 15:27
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.
3
Tilois Messages postés 721 Date d'inscription dimanche 10 juin 2001 Statut Membre Dernière intervention 27 mars 2011 7
16 mai 2010 à 17:27
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
0
microraph Messages postés 24 Date d'inscription dimanche 21 octobre 2007 Statut Membre Dernière intervention 18 mai 2010
16 mai 2010 à 17:46
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?
0
Tilois Messages postés 721 Date d'inscription dimanche 10 juin 2001 Statut Membre Dernière intervention 27 mars 2011 7
16 mai 2010 à 18:28
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
microraph Messages postés 24 Date d'inscription dimanche 21 octobre 2007 Statut Membre Dernière intervention 18 mai 2010
17 mai 2010 à 11:13
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.
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
17 mai 2010 à 16:11
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é. -
0
microraph Messages postés 24 Date d'inscription dimanche 21 octobre 2007 Statut Membre Dernière intervention 18 mai 2010
17 mai 2010 à 16:17
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.
0
microraph Messages postés 24 Date d'inscription dimanche 21 octobre 2007 Statut Membre Dernière intervention 18 mai 2010
17 mai 2010 à 16:20
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
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
17 mai 2010 à 16:55
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é. -
0
microraph Messages postés 24 Date d'inscription dimanche 21 octobre 2007 Statut Membre Dernière intervention 18 mai 2010
17 mai 2010 à 17:09
c'est du type varchar de taille (20)
0
Tilois Messages postés 721 Date d'inscription dimanche 10 juin 2001 Statut Membre Dernière intervention 27 mars 2011 7
17 mai 2010 à 17:15
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
0
microraph Messages postés 24 Date d'inscription dimanche 21 octobre 2007 Statut Membre Dernière intervention 18 mai 2010
17 mai 2010 à 18:31
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); ?
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
17 mai 2010 à 18:44
@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é. -
0
microraph Messages postés 24 Date d'inscription dimanche 21 octobre 2007 Statut Membre Dernière intervention 18 mai 2010
17 mai 2010 à 19:09
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...
0
microraph Messages postés 24 Date d'inscription dimanche 21 octobre 2007 Statut Membre Dernière intervention 18 mai 2010
17 mai 2010 à 22:06
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.
0
microraph Messages postés 24 Date d'inscription dimanche 21 octobre 2007 Statut Membre Dernière intervention 18 mai 2010
18 mai 2010 à 09:53
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'.
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
18 mai 2010 à 10:08
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é. -
0
microraph Messages postés 24 Date d'inscription dimanche 21 octobre 2007 Statut Membre Dernière intervention 18 mai 2010
18 mai 2010 à 10:31
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 :)
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
18 mai 2010 à 16:35
Avec des quotes autour d'int ?
Bon...

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