Question

Je souhaite filtrer les valeurs de la base de données en fonction de la date.

La date dans une base de données contient des valeurs telles que: 2008-12-28 18:00:00. Et ma classe a une variable DateTime en fonction de ce que je veux filtrer. Idéalement, cela fonctionnerait comme ceci: myBindingSource.Filter = "DATE ??(myDateField) = myDateTime.Date" + ajustement du format myDateTime.Date selon les besoins.

Mais une exception EvaluateException est générée: "L'expression contient l'appel de fonction non défini DATE ()."

Bien que si j'exécute directement l'instruction SQL, je peux utiliser la fonction DATE () dans le filtre.

P.S. J'utilise MYSQL DB avec le Connector / Net 5.2

Comment puis-je résoudre ce problème?

Merci à tous pour vos suggestions.

Était-ce utile?

La solution

La fonction getSqlDate n'est pas nécessaire. Vous pouvez utiliser String.Format () pour formater les dates:

String.Format("{0:yyyy-MM-dd} 00:00:00", myDateTime)

OU

myDateTime.Date.ToString("yyyy-MM-dd") + " 00:00:00"

Vous pouvez filtrer la source de liaison de la manière suivante:

myBindingSource.Filter = String.Format("myDateField >= '{0:yyyy-MM-dd}' AND myDateField < '{1:yyyy-MM-dd}'", myDateTime, myDateTime.AddDays(1));

Autres conseils

Merci Tom H.

Oui, je voulais éliminer la partie heure de la date / heure dans le filtre et votre suggestion fonctionne parfaitement.

Je laisserai la solution complète aux autres:

myBindingSource.Filter = "myDateField >= '" + getSqlDate(myDateTime) + "' AND myDateField < '" + getSqlDate(myDateTime.AddDays(1)) + "'";

où la fonction getSqlDate est:

string getSqlDate(DateTime date) {
    string year = "" + date.Year;
    string month = (date.Month < 10) ? "0" + date.Month : "" + date.Month;
    string day = (date.Day < 10) ? "0" + date.Day : "" + date.Day;

    return year + "-" + month + "-" + day + " 00:00:00";
}

Une correction à la réponse: Selon msdn , pour avoir la bonne date le mm dans

yyyy-mm-dd

devrait être capitalisé comme si;

yyyy-MM-dd

pour obtenir une date correctement formatée.

myDateField est-il le nom du champ dans l'ensemble de données? Je pense que vous voulez une expression comme celle-ci:

myBindingSource.Filter = "myDateField = " & myDateTime.Date.ToString()

Demandez-vous comment éliminer la partie heure de la date / heure dans le filtre? Je ne connais pas très bien MySQL, mais si vous utilisez une fonction quelconque qui renvoie la partie date d'un date / heure, vous risquez probablement de perdre toute chance d'utiliser un index sur cette colonne pour la requête (index existant ou futur).

Votre meilleur choix est de créer un filtre sur le front-end qui recherche une plage qui ne concerne que la date de votre filtre. Par exemple:

myBindingSource.Filter = "myDateField >= " & <code to create a string representing 12AM of your date> &
" myDateField < " & <code to create a string for 12AM of the next day>

Désolé de ne pas avoir le code exact, mais je suis un développeur SQL et mon manque de compétences en VB / C # nécessiterait que je prenne beaucoup plus de temps pour mettre au point les fonctions, alors cela vous prendrait probablement. :)

Pour rechercher entre deux dates dans DataGridView, vous pouvez utiliser ce code:

BindingSource1.Filter = "F5 >= '" + maskedTextBox1.Text + "' And " + "F5 <= '" + maskedTextBox2.Text + "'";

BindingSource1: mon datagridview datasourc se charge dans BindingSource1. F5: nom de votre colonne d'en-tête dans datagridview. maskedTextBox1: pour obtenir le premier rendez-vous. maskedTextBox2: pour obtenir une deuxième date.

Soyez performant "Arn_7"

Pour rechercher entre deux dates dans DataGridView, vous pouvez utiliser ce code:

BindingSource1.Filter = "F5 >= '" + maskedTextBox1.Text + "' And " + "F5 <= '" + maskedTextBox2.Text + "'";

BindingSource1 : my datagridview datasourc load in BindingSource1 .
F5             : name of your header column in datagridview . 
maskedTextBox1 : for get first date .
maskedTextBox2 : for get second date .
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top