Pergunta

Eu quero valores de filtro de banco de dados com base na data.

Data em um banco de dados contém valores como este: 2008-12-28 18:00:00. E minha classe tem uma variável DateTime dependendo de qual eu quero filtro. Idealmente, deveria funcionar assim: myBindingSource.Filter = "DATE(myDateField) = myDateTime.Date" + ajustando formato myDateTime.Date conforme necessário.

Mas ele lança uma EvaluateException: "A expressão contém DATA chamada de função indefinida ()"

Embora se eu executar a instrução SQL diretamente, eu posso usar a função DATE () no filtro.

P.S. Eu uso MYSQL DB com o Connector / Net 5.2

Como posso resolver este problema?

Obrigado a todos por sugestões.

Foi útil?

Solução

A função getSqlDate não é necessário. Você pode usar String.Format () para formatar datas:

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

ou

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

Você pode filtrar a fonte de ligação como esta:

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

Outras dicas

Obrigado Tom H.

Sim, eu queria eliminar a parte do tempo da data e hora no filtro e sua sugestão funciona perfeitamente.

I`ll deixar a solução completa para os outros:

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

onde a função 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";
}

A correção para a resposta: Accoring para MSDN , Para obter a data correta mm em

yyyy-mm-dd

teria que ser capitalizado como assim;

yyyy-MM-dd

para obter uma data formatado corretamente.

é myDateField o nome do campo no conjunto de dados? Eu acho que você quer uma expressão como esta:

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

Você está perguntando como eliminar a parte do tempo da data e hora no filtro? Eu não estou muito familiarizado com o MySQL, mas se você usar qualquer tipo de função que retorna a parte de data de um datetime, então é provável que matar qualquer chance de usar um índice nessa coluna para a consulta (existente ou índice futuro).

Sua melhor aposta é para criar um filtro no front-end que verifica a existência de um intervalo que é somente para sua determinada data filtro. Por exemplo:

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>

Desculpe por não ter código exato, mas eu sou um desenvolvedor de SQL e minha falta de VB / C # habilidades exigiria me levar muito mais tempo para vir acima com as funções então provavelmente iria levá-lo. :)

Para a busca entre os dois data em DataGridView você pode usar este código:

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

BindingSource1: minha carga datasourc datagridview em BindingSource1. F5: nome da sua coluna de cabeçalho no datagridview. maskedTextBox1: para obter a primeira data. maskedTextBox2:. para obter segunda data

Seja bem sucedida "Arn_7"

Para a busca entre os dois data em DataGridView você pode usar este código:

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 .
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top