Array
(
)

Buscando informacoes por periodo de Data

Alan Miranda
   - 28 nov 2011

Boa Tarde Pessoal
Então eu tenho um sistema que armazena vendas....
Agora quero efetuar uma consulta por data,irá colocar o usuário que ele quer procurar a dataincio e datafim, e irá trazer todas as informações que estão no banco.
Porem a data quem vem do banco de dados tem o seguinte formato 2011-11-07 19:54:09.657.
Mas quero consultar somente o DD/MM/YYYY, porem nao sei como fazer pelo C# e nem consultar direto do banco SQL
Me ajuda ai pessoal
Vlww

Joel Rodrigues
   - 29 nov 2011

Amigo,
se você usa SQL Server e o tipo de dados DateTime, pode fazer a consulta utilizando um objeto DateTime do .NET. Um exemplo rápido:
#Código

public DataTable BuscarVendas(DateTime dataInicio, DateTime dataFim)
{
	SqlConnection minhaConexao = new SqlConnection(stringConexao);
	SqlCommand comando = minhaConexao.CreateCommand();
	comando=commandText = SELECT * FROM VENDAS WHERE DATA BETWEEN @INICIO AND @FIM;
	comando.Parameters.AddWithValue(INICIO, dataInicio);
	comando.Parameters.AddWithValue(FIM, dataFim);
	SqlDataAdapter adap = new SqlDataAdapter(comando);
	DataTable tabResult = new DataTable();
	adap.Fill(tabResult);
	return tabResult;
}

Esse código dá pra você ter uma visão geral de como funciona o tratamento de DateTimes entre seu programa e o bd (independente do formato).
Se tiver algum erro, leve a mal não, fiz no notepad e não conferi.

Boa sorte.

Joel Rodrigues
   - 29 nov 2011

Ah, onde for string, tem ASPAS DUPLAS (o sistema do fórum retira se colocar direto, questão de codificação).

Alan Miranda
   - 29 nov 2011

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 isso diretamente no banco de dados e não da certo.

Joel Rodrigues
   - 29 nov 2011

Bem, para escrever uma instrução SQL diretamente no gerenciador do BD, você deve usar o mesmo formato do banco. O que lhe passei foi para fazer uma consulta através de sua aplicação.
Existem formas de converter a data para um formato desejado em uma consulta, pesquise sobre isso.

Alan Miranda
   - 29 nov 2011

Correto, dessa forma que vc enviou,se a pessoa Digitar DD/MM/YY para a variavel DATAINI e para DATAFIM já busco correto ? Mesmo tendo hora e segundos no Bando de dados ?

Vlw pela Força!

Flavix
   - 01 dez 2011

Vamos supor que sua aplicação passe a data no formato 2011-11-01 11:00:00 e você deseja que a consulta utilize apenas data, ignorando a hora, você pode tratar a data diretamente no banco.

Na sua consulta você faria algo assim:

select * from tb_SuaTabela
where
(Convert(Datetime,Convert(Varchar,Campo_Data,103),103) >= Convert(Datetime,Convert(Varchar,@DATAINI,103),103) OR @DATAINI IS NULL)
AND
(Convert(Datetime,Convert(Varchar,Campo_Data,103),103) <= Convert(Datetime,Convert(Varchar,@DATAFIM ,103),103) OR @DATAFIM IS NULL)

Neste primeiro exemplo as variaveis de data podem vir com valor nulo da aplicação.

Você também poderia fazer uma consulta assim:

select * from tb_SuaTabela
where
(Convert(Datetime,Convert(Varchar,Campo_Data,103),103) BETWEEN Convert(Datetime,Convert(Varchar,@DATAINI,103),103) AND Convert(Datetime,Convert(Varchar,@DATAFIM ,103),103) OR @DATAFIM IS NULL)

Neste segundo exemplo é obrigatório um valor para as variaveis, elas não poderão ter valor nulo.

Obs: Este código Convert(Datetime,Convert(Varchar,Campo_Data,103),103) converte primeiro o campo Data_Campo em um varchar no formato DD/MM/YYYY, depois o converte novamente para o tipo DATETIME no mesmo formato (DD/MM/YYYY).

Espero ter ajudado.

Alan Miranda
   - 20 dez 2011

Boa noite pessoal, desculpa a demora mas ainda estou com problema, fiz da seguinte forma.

Camada DAL
#Código


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 >= CONVERT(Varchar(10), @Dataini, 111) AND DATA <= CONVERT(Varchar(10), @Datafim, 111);
                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
#Código
public SqlDataReader consultaVendas(DateTime Dataini, DateTime Datafim)
        {
            return ObjDAL.consultaVendas(Dataini, Datafim);
        }


Camada UI
#Código
VendasInformation venda = new VendasInformation();

        DateTime Dataini = DateTime.Parse(TxtDataini.Text, dd/MM/yyyy);
        DateTime Datafim = DateTime.Parse(TxtDatafim.Text, dd/MM/yyyy);

        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 ajuda por favor

Alan Miranda
   - 20 dez 2011

Alguém ???

Alan Miranda
   - 22 dez 2011

??????????

Flavix
   - 23 dez 2011

Qual é o erro que está apresentando?

Alan Miranda
   - 23 dez 2011

Então Flavia o erro que aparece é: SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.

Os parâmetros que estou enviando são do tipo Datetime no seguinte formato DD/MM/YYYY.

Rodrigo Odasaki
   - 24 dez 2011

??????

Alan Miranda
   - 27 dez 2011

O que não entendeu Rodrigo ????

Abraçoss

Flavix
   - 27 dez 2011

Alan,
Esse erro ocorre porque um dos seus campos DateTime está vazio ou tem uma data fora do intervalo “1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM”.

Analisando o seu código temos:

Aqui você cria uma nova instância da Classe venda (ou seja, uma instância sem nenhum valor atribuído as propriedades)
VendasInformation venda = new VendasInformation();

Aqui você tenta resgatar da sua classe venda um valor para a propriedade Data, porém como anteriormente você instanciou está classe e não definiu nenhum valor ela, a mesma está vazia e ocasiona o erro.
cmd.Parameters.AddWithValue(@Dataini, venda.Data);
cmd.Parameters.AddWithValue(@Datafim, venda.Data);

O seu método SqlDataReader já recebe como parametro dois campos data, utilize eles no seu select.