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:
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 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:
Defina a tabela Funcionários com a seguinte estrutura:
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:
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:
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:
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:
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