Usuário com melhor resposta
Como comparar datas no C# utilizando MySql!

Pergunta
-
Olá pessoal!
Estou tentando comparar datas no C# + MySql e tenho dificuldades!
Estou usando a instrução SQL:
SELECT * FROM tramite WHERE dataArquivamento >= "12/09/2010" AND dataArquivamento <= "30/09/2010"
Criei dois DataTimePicker com os names dtpArquivamentoInicial e dtpArquivamentoFinal e um DataGridView para exibir os resultados, porém, quando entro com as datas mencionadas acima apenas retorna a os registros com as datas do dia “30/09/2010”.
Veja como esta o código:
public DataTable selectConsultaTramite(Tramite tramite)
{
try
{
String sql = "SELECT * FROM tramite WHERE dataArquivamento>= @dataArquivamentoInicial AND dataArquivamento <= @dataArquivamentoFinal ORDER BY idTramite";
con = new MySqlConnection(_conexaoMySQL);
MySqlCommand cmd = new MySqlCommand(sql, con);
cmd.Parameters.Add("@grupoEmpresarial", tramite.GrupoEmpresarial);
cmd.Parameters.Add("@dscSerieDocumental", tramite.DscSerieDocumental);
cmd.Parameters.Add("@classificacaoArquivistica", tramite.ClassificacaoArquivistica);
cmd.Parameters.Add("@orgaoEmissor", tramite.OrgaoEmissor);
cmd.Parameters.Add("@assuntoDocumento", tramite.AssuntoDocumento);
// Dificuldades
cmd.Parameters.Add("@dataArquivamentoInicial", tramite.DataArquivamento);
cmd.Parameters.Add("@dataArquivamentoFinal", tramite.DataArquivamento);
MySqlDataAdapter da = new MySqlDataAdapter();
da.SelectCommand = cmd;
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
catch (Exception ex)
{
throw ex;
}
}
Alguém poderia me ajudar como obter o resultado correto entre as datas?
Obrigado!
[]’s
Sérgio Pitta
Respostas
-
Sergio quando vc passa os parâmetros vc está passando o mesmo campo para as variáveis:
// Testes cmd.Parameters.Add("@dataInicio" , tramite.DataArquivamento);//A mesma variável cmd.Parameters.Add("@dataFim" , tramite.DataArquivamento);//A mesma variável
ou seja está passando para a @dataInicio e a @dataFim a mesma variável tramite.DataArquivamento, espero ter ajudado Abraços!
Pablo Batista Cardoso- Marcado como Resposta Sérgio Pitta quarta-feira, 27 de outubro de 2010 14:21
-
Olá Pablo!
Vlw pela ajuda!
Alterei as variáveis para:
p.dataArquivamentoInicial...
p.dataArquivamentoFinal...
E deu certo!
Obrigado, vlw!
[]'s
Sérgio Pitta
- Marcado como Resposta Sérgio Pitta quarta-feira, 27 de outubro de 2010 17:30
Todas as Respostas
-
Sérgio,
Aparentemente seu código está correto... Um detalhe que você poderia confirmar é se as suas variáveis datas são do tipo DateTime e se estão mesmo com os valores desejados antes de executar o comando (através de um breakpoint)... Tente também rodar a mesma consulta direto no banco de dados e veja qual é o resultado...
Uma tentativa que poderia fazer seria utilizar o operador BETWEEN ao invés do maior e menor... Ficaria algo como: BETWEEN @dataInicio AND @dataFim...
André Alves de Lima
Visite o meu site: http://www.andrealveslima.com.br
Me siga no Twitter: @andrealveslima -
Olá André!
Estou conseguindo exibir através da consulta, apenas a dataFim (30/09/2010) da comparação entre 12/09/2010 a 30/09/2010 no dataGrid...
no botão pesquisar estou declarando as variáveis da seguinte forma e utilizando um DataTimePicker (Format: Short) no Form para entrada das dadas:
p.DataArquivamento = Convert.ToDateTime(dtpArquivamentoInicial.Text);
p.DataArquivamento = Convert.ToDateTime(dtpArquivamentoFinal.Text);
UI – Interface de Usuário
private void btnPesquisar_Click(object sender, EventArgs e)
{
Tramite p = new Tramite();
...
// Testes
p.DataArquivamento = Convert.ToDateTime(dtpArquivamentoInicial.Text);
p.DataArquivamento = Convert.ToDateTime(dtpArquivamentoFinal.Text);
try
{
BLL.consultaBLL bll = new consultaBLL();
dgvResultado.DataSource = bll.selecionaConsultaTramite(p);
dgvResultado.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
}
catch (Exception ex)
{
MessageBox.Show(" Erro : " + ex.Message.ToString());
}
}
BLL – Camada de negócios
public DataTable selecionaConsultaTramite(Tramite tramite)
{
DataTable tb = new DataTable();
try
{
dal = new DAL.MySqlDAL();
tb = dal.selectConsultaTramite(tramite);
return tb;
}
catch (Exception ex)
{
throw ex;
}
}
DAL – Camada de acesso a dados
public DataTable selectConsultaTramite(Tramite tramite)
{
try
{
String sql = "SELECT * FROM tramite WHERE dataArquivamento BETWEEN @dataInicio AND @dataFim ORDER BY idTramite";
con = new MySqlConnection(_conexaoMySQL);
MySqlCommand cmd = new MySqlCommand(sql, con);
...
// Testes
cmd.Parameters.Add("@dataInicio", tramite.DataArquivamento);
cmd.Parameters.Add("@dataFim", tramite.DataArquivamento);
MySqlDataAdapter da = new MySqlDataAdapter();
da.SelectCommand = cmd;
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
catch (Exception ex)
{
throw ex;
}
}
Classe Tramite
using System;
namespace DTO //Data Transfer Object ou Transferência de Dados de Objeto
{
public class Tramite
{
...
private DateTime _dataDocumento;
private DateTime _dataArquivamento;
...
public DateTime DataDocumento
{
get { return _dataDocumento; }
set { _dataDocumento = value; }
}
public DateTime DataArquivamento
{
get { return _dataArquivamento; }
set { _dataArquivamento = value; }
}
...
}
Rodei a consulta diretamente no banco de dados e retorna o resultado. Satisfazendo a condição!
SELECT * FROM tramite WHERE dataArquivamento BETWEEN "2010-09-12" AND "2010-09-30"
O campo dataArquivamento esta definido como “date” ao invés de “datetime” no banco de dados.
Espero ter expressado corretamente a dificuldade!
[]’s
Sérgio Pitta
-
Sergio quando vc passa os parâmetros vc está passando o mesmo campo para as variáveis:
// Testes cmd.Parameters.Add("@dataInicio" , tramite.DataArquivamento);//A mesma variável cmd.Parameters.Add("@dataFim" , tramite.DataArquivamento);//A mesma variável
ou seja está passando para a @dataInicio e a @dataFim a mesma variável tramite.DataArquivamento, espero ter ajudado Abraços!
Pablo Batista Cardoso- Marcado como Resposta Sérgio Pitta quarta-feira, 27 de outubro de 2010 14:21
-
Olá Pablo!
Vlw pela ajuda!
Alterei as variáveis para:
p.dataArquivamentoInicial...
p.dataArquivamentoFinal...
E deu certo!
Obrigado, vlw!
[]'s
Sérgio Pitta
- Marcado como Resposta Sérgio Pitta quarta-feira, 27 de outubro de 2010 17:30
-
Pablo,
Nossa, bem observado... Não reparei nesse detalhe quando observei o código...
André Alves de Lima
Visite o meu site: http://www.andrealveslima.com.br
Me siga no Twitter: @andrealveslima -
Olá André!
Sua ajuda foi fundamental, pois, ainda não conhecia a função BETWEEN do SQL, pude implementar e ver o seu funcionamento, apesar de estar iniciando agora em programação orientada a objetos!
Vlw pela ajuda!
Obrigado!
[]'s
Sérgio Pitta
-
Magina!
Bom trabalho / estudos por aí!
André Alves de Lima
Visite o meu site: http://www.andrealveslima.com.br
Me siga no Twitter: @andrealveslima