VB .NET - Selecionando registros entre um intervalo de datas no SQL Server


Você já precisou selecionar registros em um intervalo de datas em um banco de dados SQL Server ?

Pode parecer uma tarefa simples, mas você pode se complicar para realizar esta tarefa.

Este artigo mostra como podemos selecionar registros em uma tabela de um banco de dados SQL Server entre um intervalo de datas.

Neste artigo eu vou usar uma consulta SQL parametrizada com a cláusula Between.

O operador BETWEEN é usado para selecionar valores dentro de um intervalo. Os valores podem ser números, textos, ou datas.

A sintaxe SQL é a seguinte:

SELECT nome_colunas
FROM nome_tabela
WHERE nome_coluna BETWEEN valor1 AND valor2

Nota: O operador Between pode apresentar resultados diferentes em bancos de dados diferentes.

Recursos usados

Criando o banco de dados

Abra o Visual Studio 2012 Express for Windows Desktop e no menu VIEW clique em Other Windows -> DataBase Explorer

Na janela do DataBase Explorer clique com o botão direito do  mouse sobre Data Connection e a seguir clique em Add Connection;

A seguir informe o nome do Servidor. Eu estou usando o SQL Server Local DB.

O Microsoft SQL Server 2012 Express LocalDB é um modo de execução do SQL Server Express destinado a desenvolvedores de programas.

A instalação do LocalDB copia um conjunto mínimo de arquivos necessários para iniciar o mecanismo de Banco de Dados do SQL Server.

Quando o LocalDB é instalado, os desenvolvedores iniciam uma conexão usando uma cadeia de conexão especial.

Na conexão, a infraestrutura necessária do SQL Server é criada e iniciada automaticamente, permitindo que o aplicativo use o banco de dados sem tarefas de configuração complexas ou demoradas.

O Developer Tools pode fornecer aos desenvolvedores um mecanismo de Banco de Dados do SQL Server que permite que eles gravem  e testem o código Transact-SQL sem precisar gerenciar uma instância de servidor inteira do SQL Server. Uma instância do SQL Server Express LocalDB é gerenciada com o utilitário SqlLocalDB.exe.

O SQL Server Express LocalDB deve ser usado em lugar do recurso de instância de usuário do SQL Server Express, que ficou obsoleto.

Informe também o nome do banco de dados que deseja criar em Connect to database e clique no botão OK;

Isso irá criar o banco de dados Cadastro.mdf no SQL Server. Vamos agora criar a tabela Funcionarios.

Na janela DataBase Explorer expanda os objetos do banco de dados Cadastro e clique com o botão direito do mouse sobre o objeto Tables;

A seguir clique em Add New Table:

Defina a tabela Funcionarios com a seguinte estrutura :

Vamos usar a tabela funcionários e campo Admissao para podermos selecionar registros em um intervalo de datas.

Criando o Projeto

Abra o Visual Studio 2012 Express for Windows Desktop e crie um novo projeto do tipo Windows Application com o nome : Obtendo_Dados_Entre_Duas_Datas

No formulário padrão form1.vb inclua os seguintes controles:

Disponha os controles no formulário conforme o leiaute da figura abaixo:

Vamos agora incluir um novo formulário no projeto para que possamos incluir dados na tabela Funcionarios e assim termos uma massa de dados para consultas.

No menu Project clique em Add Windows Forms e selecione o template Windows Form aceitando o nome Form2.vb.

No formulário form2.vb inclua os seguintes controles:

Disponha os controles no formulário conforme o leiaute da figura abaixo:

Vamos agora definir o código no formulário Form2.vb  para incluir dados na tabela Funcionarios.

No evento Click do botão de comando - Inserir Dados - inclua o código abaixo:

 Private Sub btnInserir_Click(sender As Object, e As EventArgs) Handles btnInserir.Click
        Dim strSql As String = ""
        Dim nome As String = ""
        Dim admissao As New DateTime
        Dim salario As Decimal = 0
        nome = txtNome.Text
        admissao = dtpAdmissao.Value
        salario = Convert.ToDecimal(txtSalario.Text)
        strSql = "Insert Into Funcionarios(Nome,Admissao,Salario) values(@nome,@admissao,@salario)"
        Dim con As New SqlConnection
        Dim cmd As New SqlCommand
        Try
            con.ConnectionString = "Data Source=(LocalDB)\v11.0;Initial Catalog=Cadastro;Integrated Security=True"
            con.Open()
            cmd.Connection = con
            cmd.Parameters.AddWithValue("@nome", nome)
            cmd.Parameters.AddWithValue("@admissao", admissao)
            cmd.Parameters.AddWithValue("@salario", salario)
            cmd.CommandText = strSql
            cmd.ExecuteNonQuery()
            MessageBox.Show("Dados incluídos com sucesso")
        Catch ex As Exception
            MessageBox.Show("Erro : " & ex.Message, "Inserir Registros")
        Finally
            con.Close()
        End Try
    End Sub

Para chamar o formulário form2.vb a partir do formulário form1.vb inclua o código a seguir no evento Click do botão de comando Inserir  do formulário form1.vb:

Private Sub btnInserir_Click(sender As Object, e As EventArgs) Handles btnInserir.Click
        Form2.Show()
    End Sub

Agora chamando o formulário form2.vb e com esse código conseguimos incluir diversos registros na tabela Funcionarios. Abaixo vemos a massa de dados que temos cadastrada:

Note que a data esta sendo armazenada no formato DateTime no formato dd/mm/aaaa hh:mm:ss.

Consultando dados em um intervalo de datas

Vamos agora retornar ao formulário form1.vb e definir o código para realizar a consulta em um intervalo de datas.

Vamos usar o campo Admissao da tabela Funcionarios para consultar os registros dos funcionários que foram admitidos em um intervalo de dados.

Esse é apenas um exemplo e você pode adaptar para o seu caso variando a tabela e o campo.

Private Sub btnFiltrar_Click(sender As Object, e As EventArgs) Handles btnFiltrar.Click
        Dim dtinicio As String
        Dim dtfim As String
        Dim tabela As New DataTable
        Dim strsql As String
        dtinicio = dtpInicio.Value.ToString
        dtfim = dtpFim.Value.ToString
        strsql = "Select * from Funcionarios Where admissao between @dtInicio And @dtFim order by admissao"
        Dim con As New SqlConnection
        Dim cmd As New SqlCommand
        Try
            con.ConnectionString = "Data Source=(LocalDB)\v11.0;Initial Catalog=Cadastro;Integrated Security=True"
            con.Open()
            cmd.Connection = con
            cmd.Parameters.AddWithValue("@dtInicio", dtinicio)
            cmd.Parameters.AddWithValue("@dtFim", dtfim)
            cmd.CommandText = strsql
            Using reader As SqlDataReader = cmd.ExecuteReader()
                tabela.Load(reader)
                dgvFunci.DataSource = tabela
            End Using
        Catch ex As Exception
            MessageBox.Show("Erro : " & ex.Message, "Consultar Registros")
        Finally
            con.Close()
        End Try
    End Sub

O código acima é bem simples mas quero destacar o seguinte:

A instrução SQL utiliza a cláusula Between para pesquisar em um intervalo de dados definidos no campo Admissao.

Por isso as variáveis dtinicio e dtfim usadas como parâmetros no comando SQL:

 "Select * from Funcionarios Where admissao between @dtInicio And @dtFim order by admissao"

foram definidas como do tipo string e estão recebendo seus valores do controle DataTimePicker - dtpInicio e dtpFim - convertidos para string:

 dtinicio = dtpInicio.Value.ToString
 dtfim = dtpFim.Value.ToString

Os valores são usados nos parâmetros da instrução SQL:

  cmd.Parameters.AddWithValue("@dtInicio", dtinicio)
  cmd.Parameters.AddWithValue("@dtFim", dtfim)

Finalmente criamos um DataReader e carregamos um objeto DataTable que é exibido no DataGridView - dgvFunci:

  Using reader As SqlDataReader = cmd.ExecuteReader()
                tabela.Load(reader)
                dgvFunci.DataSource = tabela
 End Using

Abaixo vemos um exemplo de execução bem sucedida para um intervalo de datas selecionado:

Note que eu não tive que me preocupar com o formato da data usada na consulta.

Se você definir as variáveis dtinicio e dtfim como do tipo DateTime não vai funcionar.

Pegue o projeto completo aqui: Obtendo_Dados_Entre_Duas_Datas.zip

Mateus 6:24 Ninguém pode servir a dois senhores; porque ou há de odiar a um e amar o outro, ou há de dedicar-se a um e desprezar o outro. Não podeis servir a Deus e às riquezas.

Veja os Destaques e novidades do SUPER DVD Visual Basic  (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Veja mais sistemas completos para a plataforma .NET no Super DVD .NET , confira...

Quer aprender C# ??

Chegou o Super DVD C#  com exclusivo material de suporte e vídeo aulas com curso básico sobre C#.

Veja também os Cursos com vídeo aulas e projetos exemplos:

    Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti