Domanda

Voglio filtrare i valori dal database in base alla data.

La data in un database contiene valori come questo: 28-12-2008 18:00:00. E la mia classe ha una variabile DateTime in base alla quale voglio filtrare. Idealmente funzionerebbe così: myBindingSource.Filter = " DATE (myDateField) = myDateTime.Date " + modifica del formato myDateTime.Date secondo necessità.

Ma genera una EvaluateException: " L'espressione contiene una funzione indefinita chiamata DATE (). "

Anche se eseguo direttamente l'istruzione SQL, posso utilizzare la funzione DATE () nel filtro.

P.S. Uso MYSQL DB con Connector / Net 5.2

Come posso risolvere questo problema?

Grazie a tutti per i suggerimenti.

È stato utile?

Soluzione

La funzione getSqlDate non è necessaria. Puoi usare String.Format () per formattare le date:

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

o

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

È possibile filtrare l'origine di associazione in questo modo:

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

Altri suggerimenti

Grazie Tom H.

Sì, volevo eliminare la porzione di tempo del datetime nel filtro e il tuo suggerimento funziona perfettamente.

Lascio la soluzione completa per gli altri:

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

dove è la funzione getSqlDate:

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

Una correzione alla risposta: Accesso a msdn , per ottenere la data corretta il mm in

yyyy-mm-dd

dovrebbe essere in maiuscolo in questo modo;

yyyy-MM-dd

per ottenere una data formattata correttamente.

myDateField è il nome del campo nel set di dati? Penso che tu voglia un'espressione come questa:

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

Stai chiedendo come eliminare la parte temporale del datetime nel filtro? Non ho troppa familiarità con MySQL, ma se usi qualsiasi tipo di funzione che restituisce la porzione di data di un datetime, è probabile che tu uccida qualsiasi possibilità di utilizzare un indice su quella colonna per la query (indice esistente o futuro).

La soluzione migliore è quella di creare un filtro sul front-end che controlli un intervallo che è solo per la data del filtro specificata. Ad esempio:

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>

Ci scusiamo per non avere il codice esatto, ma sono uno sviluppatore SQL e la mia mancanza di competenze VB / C # mi richiederebbe molto più tempo per inventare le funzioni di quanto probabilmente ti richiederebbe. :)

Per la ricerca tra due date in DataGridView è possibile utilizzare questo codice:

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

BindingSource1: il mio datagridview viene caricato in BindingSource1. F5: nome della colonna di intestazione in datagridview. maskedTextBox1: per ottenere il primo appuntamento. maskedTextBox2: per ottenere il secondo appuntamento.

Avere successo " Arn_7 "

Per la ricerca tra due date in DataGridView è possibile utilizzare questo codice:

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 .
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top