PROBLEMA ESTRANHO EM QUERY SQL

 Tópico anterior Próximo tópico Novo tópico

PROBLEMA ESTRANHO EM QUERY SQL

VB.NET

 Compartilhe  Compartilhe  Compartilhe
#482938 - 12/07/2018 11:49:37

FUTURA
.
Cadast. em:Maio/2004


Pessoal, tenho a seguinte situação, vou resumir, em um form entre outros campos, tenho 2 DtPickers, onde passo como parâmetros abaixo:

Dim dtinicio = dt1.Value.ToString
Dim dtfim = dt2.Value.ToString
Sql =" select ............................  where emissao between @dtinicio and @dtfim "


Ocorre que entre vários clientes, apenas 1, parece não respeitar o filtro, por ex:, se informo o filtro do dia, mesmo tendo dados, não aparecem, se coloco do dia 1 do mês, vem desde o começo do ano..  já verifiquei no sql server, esta normal. Não entendi até o momento o que esta ocorrendo.



Resposta escolhida #482939 - 12/07/2018 12:03:12

JABA
CABO FRIO
Cadast. em:Agosto/2005


Última edição em 12/07/2018 12:08:44 por JABA

Coloque esses campos no banco como data ao invés de VarChar.

O que pode estar acontecendo é que os formatos das datas estão diferentes. Ou seja, o primeiro digito da data no banco pode estar sendo o mês, e você está passando como se fosse o dia no parâmetro.


_______________________________________________________________________________________________

Se a alma ou espírito são imateriais, como eles fazem para se localizarem quando o corpo está em movimento?



#482940 - 12/07/2018 12:13:13

FUTURA
.
Cadast. em:Maio/2004


No banco, esse campo é datetime, o formato dentro da tabela esta "yyyy-mm-dd", tenho um padrão em todos os clientes, e só neste esta dando o problema, fiz uma conexão ao banco dele, direto aqui do meu micro, e da o mesmo problema, então descartei ser algo de formato de datas la na estação..



#482943 - 12/07/2018 12:20:28

JABA
CABO FRIO
Cadast. em:Agosto/2005


Última edição em 12/07/2018 12:21:50 por JABA

Faça o teste passando os parâmetros como data também então, pois eles estão como string. Depois de fazer isso, depure pra ver como o formato dela está chegando ao banco.


_______________________________________________________________________________________________

Se a alma ou espírito são imateriais, como eles fazem para se localizarem quando o corpo está em movimento?



#482944 - 12/07/2018 12:25:31

FUTURA
.
Cadast. em:Maio/2004


Jaba, e como ficaria a formatação destes parâmetros como data ?, na vdd meu sistema, é em vb6, onde funciona tudo certo, neste caso, é meu gerenciador de notas, que esta em vb.net, e até então o filtro estava normal.. abaixo segue a sql completa:

Dim dtinicio = dt1.Value.ToString
Dim dtfim = dt2.Value.ToString

Sql = " select A.nota,A.natureza,A.emissao,A.cliente,A.valor,A.st_nfe,A.chave_nfe,A.recibo_nfe,A.lote_nfe,A.ptc_nfe,A.id_ev,A.emailsend,B.razao,B.email from notas A, clientes B "
Sql = Sql & " where A.emissao between @dtinicio and @dtfim "
Sql = Sql & " and A.empresa = " & Mid(cmbempresas.Text, 1, 2) & "   "

  If Trim(txtcodigo.Text) <> "" Then
     Sql = Sql & " and A.cliente =" & txtcodigo.Text & ""
  End If
  If Trim(cmbstatus.Text) <> "" Then
    Sql = Sql & " and A.st_nfe ='" & Mid(cmbstatus.Text, 1, 1) & "' "
  End If
  Sql = Sql & " and A.cliente = B.codigo"
  Sql = Sql & " order by A.nota "

  Sqlcmd = New SqlCommand(Sql, Cnn)
  Sqlcmd.Parameters.AddWithValue("@dtInicio", dtinicio)
  Sqlcmd.Parameters.AddWithValue("@dtFim", dtfim)

  Dr = Sqlcmd.ExecuteReader
If Dr.HasRows = False Then
   .........
   ........
  



#482946 - 12/07/2018 13:38:11

GUIMORAES
ITAPETININGA
Cadast. em:Agosto/2009


Última edição em 12/07/2018 13:39:03 por GUIMORAES

Citação:
:
Jaba, e como ficaria a formatação destes parâmetros como data ?, na vdd meu sistema, é em vb6, onde funciona tudo certo, neste caso, é meu gerenciador de notas, que esta em vb.net, e até então o filtro estava normal.. abaixo segue a sql completa:

Dim dtinicio = dt1.Value.ToString
Dim dtfim = dt2.Value.ToString

Sql = " select A.nota,A.natureza,A.emissao,A.cliente,A.valor,A.st_nfe,A.chave_nfe,A.recibo_nfe,A.lote_nfe,A.ptc_nfe,A.id_ev,A.emailsend,B.razao,B.email from notas A, clientes B "
Sql = Sql & " where A.emissao between @dtinicio and @dtfim "
Sql = Sql & " and A.empresa = " & Mid(cmbempresas.Text, 1, 2) & "   "

  If Trim(txtcodigo.Text) <> "" Then
     Sql = Sql & " and A.cliente =" & txtcodigo.Text & ""
  End If
  If Trim(cmbstatus.Text) <> "" Then
    Sql = Sql & " and A.st_nfe ='" & Mid(cmbstatus.Text, 1, 1) & "' "
  End If
  Sql = Sql & " and A.cliente = B.codigo"
  Sql = Sql & " order by A.nota "

  Sqlcmd = New SqlCommand(Sql, Cnn)
  Sqlcmd.Parameters.AddWithValue("@dtInicio", dtinicio)
  Sqlcmd.Parameters.AddWithValue("@dtFim", dtfim)

  Dr = Sqlcmd.ExecuteReader
If Dr.HasRows = False Then
   .........
   ........
  


Acho que você não entendeu ainda.
Você deve passar a data com o tipo DateTime e não com o tipo string

  
Dim dtinicio = dt1.Value.ToString
Dim dtfim = dt2.Value.ToString


Deve ficar assim:

  
Dim dtinicio = dt1.Value
Dim dtfim = dt2.Value


O problema que está ocorrendo é que você está passando a sua data como string, e o banco não está conseguindo interpretar da forma correta.
Outro detalhe importante, é você utilizar parametrização em tudo. No seu código, tem parte com parâmetro e parte com concatenação, o que torna seu código vulnerável.





#482947 - 12/07/2018 13:54:21

JABA
CABO FRIO
Cadast. em:Agosto/2005


Última edição em 12/07/2018 13:55:53 por JABA

Você pode também fazer uma conversão assim:
DateTime.Parse(data).ToString("yyyy-mm-dd")


Aqui você pode tirar todas as suas dúvidas: www.macoratti.net/15/08/vbn_mcal2.htm




_______________________________________________________________________________________________

Se a alma ou espírito são imateriais, como eles fazem para se localizarem quando o corpo está em movimento?



#482952 - 12/07/2018 15:04:26

FUTURA
.
Cadast. em:Maio/2004


Passando apenas como data, deu certo:

Dim dtinicio = dt1.Value
Dim dtfim = dt2.Value

Fiquei um pouco intrigado, pois dentre alguns, esse foi o primeiro caso, inclusive todos os testes que fiz aqui, filtrando por períodos, não acusou nenhum problema, e o padrão do banco, tabelas, etc, são idênticos.

OBS: Quando eu instalo o sql server, é sempre um default, e no meu sistema principal, tenho uma função que passo nas queries que formata a data para "yyyymmdd", para gravar padronizado no banco, no caso, passando apenas o "value" do objeto dtpicker, que esta no padrão ddmmyyyy, pode gerar alguma diferença ?, ou a interpretação é feita de forma automática ?



#482955 - 12/07/2018 16:10:47

JABA
CABO FRIO
Cadast. em:Agosto/2005


Quando você converte a data do controle para string, você acaba pegando o formato dela como está sendo exibida no controle, podendo assim ficar diferente do formato que você configurou o banco. Quando você não faz essa conversão, a formatação fica no padrão da linguagem. É só depurar o código para ver as diferenças.

_______________________________________________________________________________________________

Se a alma ou espírito são imateriais, como eles fazem para se localizarem quando o corpo está em movimento?



 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por FUTURA em 30/07/2018 11:31:58