none
Problemas com DATA RRS feed

  • Pergunta

  • Boa Tarde Pessoal

    Então eu tenho um sistema que armazena vendas....

    Agora quero efetuar uma consulta por data, porem a data quem vem do banco de dados que tem o seguinte formato 2011-11-07 19:54:09.657.

    Mas quero consultar o mês o ano e o dia, porem nao sei como fazer...

    Me ajuda ai pessoal

    Vlww

    segunda-feira, 28 de novembro de 2011 21:14

Todas as Respostas

  • Compara a data desta forma no banco. 

     

    Convert(varchar(10),campodoBanco,120) = "2011-11-07"

     

    Apesar de nao ser o mais eficiente, é o mais prático p vc...

    segunda-feira, 28 de novembro de 2011 21:49
  • Alan,

    Crie uma procedure que receba por parâmetro um DATETIME.

    Sua procedure pode ficar assim:

    IF EXISTS(SELECT TOP 1 1 FROM sysObjects WHERE NAME = 'spConsultarPorData')
    	DROP PROCEDURE spConsultarPorData
    GO
    
    CREATE PROCEDURE spConsultarPorData
    	@VARIAVEL DATETIME
    AS
    BEGIN
    
    	SELECT * FROM tbDatas D WHERE D.dtData = @VARIAVEL
    
    END
    GO
    


    E a execução da procedure fica assim:

    EXEC spConsultarPorData '1988-10-19'
    


    O cast proposto pelo Mateus funciona, mas consome mais recursos do banco de dados.

    A forma mais performática é utilizar os próprios tipos de dados fornecidos pelo SQL.

    []s!

     


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.wordpress.com/
    Twitter: @ferhenrique
    segunda-feira, 28 de novembro de 2011 23:18
    Moderador
  • 'Select colunas from tabela where Data between @dataInicial and @dataFinal;'

    Utilize SqlCommand, e faça o uso de Parameters, para adicionar suas datas no local indicado.

    Nada de fazer Convert em consulta sql.

     

    http://www.dotnetperls.com/sqlclient    - Add variables to Table.

    Exemplo para utilizar parameters.


    Quem sabe um dia os DataSets se extinguirão?
    terça-feira, 29 de novembro de 2011 02:37
  • Tenta algo assim
    select * from Venda where year(dataVenda) = DateTime.Now.ToString("yyyy") and month(dataVenda) = DateTime.Now.ToString("MM") and (day(dataVenda) = DateTime.Now.ToString("dd");
    



    Se a sugestão resolver o problema, favor marcar como Resposta.
    terça-feira, 29 de novembro de 2011 11:27
  • Então mas se o usuário procurar com a Data do formato: DD/MM/YY - 10/15/1990, no banco de dados ele vai reconhecer ?, pois tento fazer a consulta diretamente no banco de dados com esse formato e não da certo.
    Select * from Vendas where DATA = '2011/11/07'
    
    Coloquei dessa forma e não deu certo...
    terça-feira, 29 de novembro de 2011 12:09
  • Então assim.

    Não use isso aqui também. year(dataVenda)

    Para efetuar pesquisa de data sempre utilize between.

    Se você utilizar parameters, ele vai fazer automaticamente a conversão para o formato que o banco necessita, desde que vc passe um objeto do tipo data e não string (isso é muito importante)

    Aqui tem um exemplo de insert. O mesmo vale para os selects.

    Para converter strings para Data, vc usa a função DateTime.TryParseExact()

    SqlCommand cmd = new SqlCommand("INSERT INTO <table> (<column>) VALUES (@value)", connection);
    cmd
    .Parameters.AddWithValue("@value", dateTimeVariable); dateTimeVariable deve ser do tipo DateTime

    cmd
    .ExecuteNonQuery();

    Quem sabe um dia os DataSets se extinguirão?
    terça-feira, 29 de novembro de 2011 13:01
  • Então eu fiz assim Óh! Mas acho que a Data está indo no formato incorreto.

    CAMADA DAL:

    public SqlDataReader consultaVendas(DateTime Dataini, DateTime Datafim)
            {
                SqlConnection cn = new SqlConnection();
    
                VendasInformation venda = new VendasInformation();
    
                try
                {
                    cn.ConnectionString = Dados.StringDeConexao;
    
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = cn;
    
                    cmd.CommandType = CommandType.Text;
                    cmd.CommandText = ("Select * from Vendas Where DATA BETWEEN @Dataini AND @Datafim");
                    cmd.Parameters.AddWithValue("@Dataini", venda.Data);
                    cmd.Parameters.AddWithValue("@Datafim", venda.Data);
    
                    cn.Open();  
    
                    SqlDataReader Leitor;
    
                    Leitor = cmd.ExecuteReader();
    
                    while (Leitor.Read())
                    {
                        venda.Codigo = Convert.ToInt32(Leitor["CODIGO"]);
                        venda.Data = Convert.ToDateTime(Leitor["DATA"]);
                        venda.Quantidade = Convert.ToInt32(Leitor["QUANTIDADE"]);
                        venda.Faturado = Convert.ToBoolean(Leitor["FATURADO"]);
                        venda.Codigocliente = Convert.ToInt32(Leitor["CODIGOCLIENTE"]);
                        venda.Codigoproduto = Convert.ToInt32(Leitor["CODIGOPRODUTO"]);
                    }
    
                    return Leitor;
                }
                catch (SqlException ERR)
                {
                    throw new Exception("ERRO NA CONEXÃO" + ERR.Message);
                }
                finally
                        {
                    cn.Close();
                }
            }
    
    


    CAMADA BLL

    public SqlDataReader consultaVendas(DateTime Dataini, DateTime Datafim)
            {
                return ObjDAL.consultaVendas(Dataini, Datafim);
            }
    


    UI:

    VendasInformation venda = new VendasInformation();
    
            DateTime Dataini = Convert.ToDateTime(TxtDataini.Text);
            DateTime Datafim = Convert.ToDateTime(TxtDatafim.Text);
    
            Response.Write(Dataini);
            Response.Write(Datafim);
    
            VendasBLL dados = new VendasBLL();
            dados.consultaVendas(Dataini, Datafim);
    
            TxtCodigo.Text = Convert.ToString(venda.Codigo);
            TxtQuantidade.Text = Convert.ToString(venda.Quantidade);
            TxtFaturado.Text = Convert.ToString(venda.Faturado);
            TxtCocCliente.Text = Convert.ToString(venda.Codigocliente);
            TxtCodProduto.Text = Convert.ToString(venda.Codigoproduto);
            TxtData.Text = Convert.ToString(venda.Data);
    
    


    Pessoal me ajudem por favor

    Obrigado

     

    sexta-feira, 2 de dezembro de 2011 23:31
  • Olá Alan,

    Faça assim com sua camada de acesso a dados:

    public SqlDataReader consultaVendas(DateTime Dataini, DateTime Datafim)
            {
                Datafim = new DateTime(Datafim.Year, Datafim.Month, Datafim.Day, 23, 59, 59);
    
                SqlConnection cn = new SqlConnection();
    
                VendasInformation venda = new VendasInformation();
    
                try
                {
                    cn.ConnectionString = Dados.StringDeConexao;
    
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = cn;
    
                    cmd.CommandType = CommandType.Text;
                    cmd.CommandText = ("Select * from Vendas Where DATA BETWEEN @Dataini AND @Datafim");
                    cmd.Parameters.AddWithValue("@Dataini", venda.Data);
                    cmd.Parameters.AddWithValue("@Datafim", venda.Data);
    
                    cn.Open();  
    
                    SqlDataReader Leitor;
    
                    Leitor = cmd.ExecuteReader();
    
                    while (Leitor.Read())
                    {
                        venda.Codigo = Convert.ToInt32(Leitor["CODIGO"]);
                        venda.Data = Convert.ToDateTime(Leitor["DATA"]);
                        venda.Quantidade = Convert.ToInt32(Leitor["QUANTIDADE"]);
                        venda.Faturado = Convert.ToBoolean(Leitor["FATURADO"]);
                        venda.Codigocliente = Convert.ToInt32(Leitor["CODIGOCLIENTE"]);
                        venda.Codigoproduto = Convert.ToInt32(Leitor["CODIGOPRODUTO"]);
                    }
    
                    return Leitor;
                }
                catch (SqlException ERR)
                {
                    throw new Exception("ERRO NA CONEXÃO" + ERR.Message);
                }
                finally
                        {
                    cn.Close();
                }
            }
    
    

    No aguardo.


    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.wordpress.com/
    Twitter: @ferhenrique
    sábado, 3 de dezembro de 2011 14:38
    Moderador
  • Olá Alan,

    Acredito que o problema não esteja na sua camada de dados, pois ao passar o parâmetro como DateTime, como você já está fazendo, haverá uma conversão para o tipo DATETIME do SQL Server.

    Acho que o problema está na hora de transformar o texto do seu TextBox para DateTime, nas seguintes linhas:

     

    DateTime Dataini = Convert.ToDateTime(TxtDataini.Text);
    DateTime Datafim = Convert.ToDateTime(TxtDatafim.Text);
    

     

    Verifique se você está usando as opções corretas de globalization. Use da seguinte forma no seu web.config:

    <globalization uiCulture="pt" culture="pt-BR" />

    Aqui tem mais informações: http://www.emilaneze.com.br/2011/03/aspnet-formatacao-de-datas-e-numeros.html


    Eric Milaneze
    Blog: http://www.emilaneze.com.br
    segunda-feira, 5 de dezembro de 2011 02:23
  • Sobre o SELECT que você colocou anteriormente (Select * from Vendas where DATA = '2011/11/07'), para ter certeza que você vai buscar para esse dia independente da hora e da configuração do seu SQL Server, você poderia fazer da seguinte forma:

    SELECT * FROM Vendas 
    	WHERE 
    		DATA >= CONVERT(DATETIME, '2011/11/07', 111) 
    		AND 
    		DATA < CONVERT(DATETIME, '2011/11/07', 111) + 1
    



    Eric Milaneze
    Blog: http://www.emilaneze.com.br
    segunda-feira, 5 de dezembro de 2011 02:34
  • Então tentei configurar o globalization porém da erro..

    preciso colocar dentro da TAG <configuration> ?

    Obrigado

    quinta-feira, 8 de dezembro de 2011 02:26