Frage

Ich mag Werte aus der Datenbank filtern, basierend auf Datum.

Datum in einer Datenbank enthält Werte wie folgt aus: 2008-12-28 18.00.00. Und meine Klasse hat ein Datetime-Variable in Abhängigkeit von dem ich filtern mag. Im Idealfall würde es so funktionieren: myBindingSource.Filter = "DATE(myDateField) = myDateTime.Date" + Einstellen myDateTime.Date Format je nach Bedarf.

Aber es wirft einen EvaluateException: "Der Ausdruck enthält nicht definierte Funktionsaufruf DATE ()"

Obwohl, wenn ich die SQL-Anweisung direkt ausgeführt wird, kann ich die Funktion DATE () in Filter verwenden.

P. S. Ich verwende MYSQL DB mit dem Connector / Net 5.2

Wie kann ich dieses Problem lösen?

Vielen Dank für Anregungen.

War es hilfreich?

Lösung

Die getSqlDate Funktion nicht benötigt wird. Sie können String.Format (), um Datum- verwenden:

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

oder

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

Sie könnten die Bindungsquelle wie folgt filtern:

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

Andere Tipps

Danke Tom H.

Ja, ich wollte die Zeit Teil des Datetime im Filter und Ihr Vorschlag funktioniert perfekt beseitigen.

I `ll die komplette Lösung für die anderen verlassen:

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

Dabei gilt getSqlDate Funktion:

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";
}

Eine Korrektur auf die Antwort: Accoring Msdn , Um das richtige Datum zu erhalten mm in

yyyy-mm-dd

werden müssten aktiviert wie so;

yyyy-MM-dd

ein korrekt formatierte Datum zu erhalten.

ist der Name des Feldes im Datensatz myDateField? Ich glaube, Sie einen Ausdruck wie diese wollen:

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

Sind Sie fragen, wie Sie den Zeitteil des Datetime im Filter zu beseitigen? Ich bin nicht allzu vertraut mit MySQL, aber wenn Sie jede Art von Funktion verwenden, die den Datumsteil eines Datum zurückgibt, dann sind Sie wahrscheinlich eine Chance, über einen Index auf dieser Spalte für die Abfrage (bestehende oder zukünftige Index) zu töten.

Ihre beste Wette ist, einen Filter auf dem vorderen Ende zu schaffen, die für einen Bereich überprüft, die nur für Ihren gegebenen Filter Datum ist. Zum Beispiel:

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>

Es tut sich nicht genauen Code zu haben, aber ich bin einen SQL-Entwickler und meinen Mangel an VB / C # Fähigkeiten würde ich braucht viel mehr Zeit in Anspruch nehme mit den Funktionen zu kommen, dann wäre es wahrscheinlich dauern. :)

Für die Suche zwischen zwei Daten in Datagridview können Sie diesen Code verwenden:

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

BindingSource1: meine Datagridview datasourc Last in BindingSource1. F5: Name Ihres Kopfspalte in Datagridview. maskedTextBox1: zum ersten Date bekommen. maskedTextBox2. für die zweite Datum erhalten

Seien Sie erfolgreich "Arn_7"

Für die Suche zwischen zwei Daten in Datagridview können Sie diesen Code verwenden:

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 .
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top