none
Como comparar datas no C# utilizando MySql! RRS feed

  • 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

    terça-feira, 26 de outubro de 2010 23:55

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
    quarta-feira, 27 de outubro de 2010 13: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
    quarta-feira, 27 de outubro de 2010 14:16

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
    quarta-feira, 27 de outubro de 2010 08:29
    Moderador
  • 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

     

    quarta-feira, 27 de outubro de 2010 12:58
  • 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
    quarta-feira, 27 de outubro de 2010 13: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
    quarta-feira, 27 de outubro de 2010 14:16
  • 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
    quarta-feira, 27 de outubro de 2010 15:20
    Moderador
  • 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

    quarta-feira, 27 de outubro de 2010 17:35
  • Magina!

    Bom trabalho / estudos por aí!


    André Alves de Lima
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    quarta-feira, 27 de outubro de 2010 21:53
    Moderador