.NET

18 jul, 2014

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

Publicidade

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 realizá-la. Este artigo mostra como podemos selecionar registros em uma tabela de um banco de dados SQL Server entre um intervalo de datas.

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:

  • Microsoft SQL Server 2012
  • Visual Studio 2012 Express for Windows Desktop
  • Linguagem Visual Basic .NET
  • Conceitos de SQL

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:

sql_pd2d1

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:

sql_pd2d2

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

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:

sql_pd2d3

Defina a tabela Funcionários com a seguinte estrutura:

sql_pd2d4

Vamos usar a tabela funcionários e campo Admissão 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:

  • Label1 – Data Inicio
  • Label2 – Data Fim
  • DateTimePicker – dtpInicio
  • DateTimePicker – dtpFim
  • DataGridView – dgvFunci
  • Button – btnSair
  • Button – btnInserir
  • Button – btnFiltrar

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

sql_pd2d5

Vamos agora incluir um novo formulário no projeto para que possamos incluir dados na tabela Funcionários 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:

  • Label1 – Nome
  • Label2 – Data Admissão
  • Label3 – Salário
  • TextBox – txtNome
  • DataTimePicker – dtpAdmissao
  • TextBox – txtSalario
  • Button – btnSair
  • Button – btnInserir

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

sql_pd2d6

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

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 Funcionários. Abaixo vemos a massa de dados que temos cadastrada:

sql_pd2d7

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 Admissão. 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:

sql_pd2d8

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