none
SELECT com parametros mes e ano separados RRS feed

  • Pergunta

  • Olá necessito fzer um select

    onde o usuário irá entrar com parametros de data separados

    ele colocara o mes de entrada e o  ano de entrada

    e depois o mes de saida e o ano de saida  e neste filtro ele obtera o resultado final

    com a ajuda do Fabrizzio com este script abaixo:

    declare @entrada_mes int
    declare @entrada_ano int
    declare @saida_mes int
    declare @saida_ano int

    --SET DE VARIAVEIS

    set @entrada_mes = 05
    set @entrada_ano = 2007
    set @saida_mes = 06
    set @saida_ano = 2008
    declare @entrada varchar(100)
    declare @saida varchar(100)

    --SELECT

    set @entrada = cast(@entrada_ano as varchar) + '-' + cast(@entrada_mes as varchar) + '-' + '01'
    set @saida = cast(@saida_ano as varchar) + '-' + cast(@saida_mes as varchar) + '-' + '30'
    select * from treino
    where
    data_recebimento > cast(@entrada as datetime)
    and data_saida < cast(@saida as datetime)

     

    estava tentando mas ocorreu o seguinte erro:

    Msg 242, Level 16, State 3, Line 19
    A conversão de um tipo de dados varchar em um tipo de dados datetime resultou em um valor fora do intervalo.

    até agora não consegui identificar o por q deste erro

     

    Obrigado

     

     

     

    segunda-feira, 9 de maio de 2011 15:43

Respostas

  • Brown,

     

    Antes de tudo, o fato dos dados estarem inconsistentes no select, quer dizer que ha dados inconsistentes na sua base, de maneira que a saida esta antes da entrada, deixando isso de lado, se é necessario que a data de entrada seja menor que a de saida, segue novo script:

     

    declare @entrada_mes int
    declare @entrada_ano int
    declare @saida_mes int
    declare @saida_ano int

    --SET DE VARIAVEIS

    set @entrada_mes = 05
    set @entrada_ano = 2007
    set @saida_mes = 06
    set @saida_ano = 2008
    declare @entrada varchar(100)
    declare @saida varchar(100)

    --SELECT

    set @entrada = cast(@entrada_ano as varchar) + '-' + cast(@entrada_mes as varchar) + '-' + '01'
    set @saida = cast(@saida_ano as varchar) + '-' + cast(@saida_mes as varchar) + '-' + '30'
    select * from treino
    where 
    data_recebimento > cast(@entrada as datetime) 
    and data_saida < cast(@saida as datetime)

    and data_recebimento < data_saida


    Oracle OCA11g, MCC 2011!
    • Marcado como Resposta Eder Costa segunda-feira, 16 de maio de 2011 18:24
    segunda-feira, 9 de maio de 2011 19:03
    Moderador

Todas as Respostas

  • Ei Bronw....tente fazer dessa forma..

    voce esta tendo problema no @Entrada_mes e @saida_mes porque esta com datatype INT, quando voce esta setando o parametro em 05 ou 06 o datatype esta

    removendo o 0 por isso esta apresentando o erro.

     

    declare @entrada_mes int
    declare @entrada_ano int
    declare @saida_mes int
    declare @saida_ano int

    --SET DE VARIAVEIS

    set @entrada_mes = 05
    set @entrada_ano = 2007
    set @saida_mes = 06
    set @saida_ano = 2008
    declare @entrada varchar(100)
    declare @saida varchar(100)

    --SELECT

    set @entrada = cast(@entrada_ano as varchar) + right( '00' + cast(@entrada_mes as varchar), cast(@entrada_mes as varchar) ) + '01'
    set @saida = cast(@saida_ano as varchar) + right( '00' + cast(@saida_mes as varchar), cast(@saida_mes as varchar) ) + '01'

    select * from treino
    where
    data_recebimento >= cast(@entrada as datetime)
    and data_saida < cast(@saida as datetime)

     

    espero ter ajudado....


    Thread foi útil ? Então vote !!
    ------------------------------------------------------------
    Maxwell Chaves
    MCTS - SQL Server 2008
    maxwellchaves.wordpress.com.br
    segunda-feira, 9 de maio de 2011 15:52
  • Olha, a única maneira de o script que o Fabrizzio te passou dar errado, pelo que testei, é se o seu padrão de data não esiver do padrão inglês.

    De qualquer forma, se quiser, teste com o select abaixo (que na verdade é praticamente o mesmo do Fabrizzio):

    Select * From Treino Where
    (data_recebimento > (Convert(DateTime, Convert(VarChar(02), @entrada_mes) + '/01/' + Convert(VarChar(04), @entrada_ano)))) and
    (data_saida       < (Convert(DateTime, Convert(VarChar(02), @saida_mes)   + '/30/' + Convert(VarChar(04), @saida_ano))))


    Roberson Ferreira


    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    segunda-feira, 9 de maio de 2011 16:06
    Moderador
  • No inicio do codigo, adicione:

     

    set dateformat ymd

     

    E veja se o erro continua.


    Oracle OCA11g, MCC 2011!
    segunda-feira, 9 de maio de 2011 16:16
    Moderador
  • Fabrizzio colocando este trecho no inicio

    fez com q não aparecesse erro porém não retornou dados

    a consulta veio em branco e teria dados nesses anos com certeza.

    segunda-feira, 9 de maio de 2011 17:19
  • Fala Maxweell

    alterando o código como vc fez apresentou o erro:

    Falha ao converter data e/ou hora da cadeia de caracteres.

    o banco esta com format data + brasileiro.

    Abraço

     

    segunda-feira, 9 de maio de 2011 17:22
  • tente inverter e usar

    set dateformat dmy


    Analista Desenvolvedor
    segunda-feira, 9 de maio de 2011 18:05
  • Ei Brown....to mandando um novo scritp, roda ele e ve o que aparece nos result. olhe primeiro se a data que esta retornando atende a sua necessidade.

    declare @entrada_mes int
    declare @entrada_ano int
    declare @saida_mes int
    declare @saida_ano int
    
    --SET DE VARIAVEIS
    
    set @entrada_mes = 05
    set @entrada_ano = 2007
    set @saida_mes = 06
    set @saida_ano = 2008
    
    declare @entrada varchar(100)
    declare @saida varchar(100)
    
    SET @entrada = CAST( @entrada_ano AS VARCHAR ) + RIGHT( '00' + CAST( @entrada_mes AS VARCHAR ), 2 ) + '01'
    SET @saida = CAST( @saida_ano AS VARCHAR ) + RIGHT( '00' + CAST( @saida_mes AS VARCHAR ), 2 ) + '01'
    
    SELECT @entrada, CAST ( @ENTRADA AS DATETIME )
    SELECT @saida, CAST ( @saida AS DATETIME )
    


    Thread foi útil ? Então vote !!
    ------------------------------------------------------------
    Maxwell Chaves
    MCTS - SQL Server 2008
    maxwellchaves.wordpress.com.br
    • Sugerido como Resposta Eder Costa segunda-feira, 16 de maio de 2011 18:26
    segunda-feira, 9 de maio de 2011 18:07
  • rapaziada to tstando aqui e daqui a pouco retorno pra vcs
    segunda-feira, 9 de maio de 2011 18:14
  • maxwell

    rodou não deu erro porén  ele só pega a data setada

    se eu selecionei mes 06 e ano 2008  como entrada

    e mes 05 e ano 2010  como saida

     

    ele só pega toda os registros q tem estas data  o q esta entre ele  não pega

    segunda-feira, 9 de maio de 2011 18:38
  • Fabrizzio

    rodou o erro era por q tinha campos nulos

    O problema é q em vários registros  a data de saida é menor q a data de entrada

    o q esta errado

     

    Abraço

    segunda-feira, 9 de maio de 2011 18:39
  • Roberson

    a mesma coisa q ocorreu com o script do Fabrizzio

    roda mais tras data saida meno q a data de entrada.

    segunda-feira, 9 de maio de 2011 18:40
  • Brown,

     

    Poderia dar um erro sobre este erro que esta ocorrendo?

     

    poste um retorno que segundo voce esta com a data de saida menor que a data de entrada.


    Oracle OCA11g, MCC 2011!
    segunda-feira, 9 de maio de 2011 18:48
    Moderador
  • Brown, pelo que estou vendo a situacao que esta acontecendo que o seu select, so ira lhe retornar os registros que tenha a DATA_RECEBIMENTO >= @ENTRADA e DATA_SAIDA = @SAIDA, nao tem como trazer um intervalo entre esses dois campo, pois o que ira trazer apenas os registro que tiverem a DATA_SAIDA preenchida, explica melhor o que voce esta querendo.


    Thread foi útil ? Então vote !!
    ------------------------------------------------------------
    Maxwell Chaves
    MCTS - SQL Server 2008
    maxwellchaves.wordpress.com.br
    segunda-feira, 9 de maio de 2011 18:50
  • Fabrizzio o script esta rodando não esta dando erro mas

    esta ocorrendo o seguinte a data de saida esta aparecendo para o registro como menor q a data de estrada

    desta forma:

    matricula                    data de entrada                     data de saida

    00000014891948    2008-01-24 00:00:00.000    2008-02-07 00:00:00.000
    00000014891948    2008-01-21 00:00:00.000    2007-08-07 00:00:00.000
    00000014891948    2008-01-21 00:00:00.000    2007-08-16 00:00:00.000
    00000014891948    2008-01-21 00:00:00.000    2007-12-21 00:00:00.000

    e setamos desta forma:

    set @entrada_mes = 01
    set @entrada_ano = 2007
    set @saida_mes = 01
    set @saida_ano = 2008

     

    a data de entrada não poderia esta maior q a de saida

    o quero obter , por exemplo,  seria todos os registros q tenham o ano de estrada e mes 2008 01  até o de saida 2009 01

    segunda-feira, 9 de maio de 2011 18:56
  • Maxwell tudo bem?

    O que quero é o seguinte:

    tenho um select e neste select o usuário ira colocar 4 paramentros (mes estrada, ano entrada), (mes saida e ano saida),

    e quero q todos os registros q estiverem neste intervalo sejam listados

     

    por exemplo mes = 04, ano = 2007

                       mes = 09, ano = 2010.

     

    seria fácil se pudesse usar todo o campo data pois com um between conseguiria, as estes paramentros são dados separados.

    o campo data entrada e saida tem o seguinte formato : 2007-08-03 00:00:00.000

    e o sql esta em brasil

     

     

    segunda-feira, 9 de maio de 2011 19:02
  • Brown,

     

    Antes de tudo, o fato dos dados estarem inconsistentes no select, quer dizer que ha dados inconsistentes na sua base, de maneira que a saida esta antes da entrada, deixando isso de lado, se é necessario que a data de entrada seja menor que a de saida, segue novo script:

     

    declare @entrada_mes int
    declare @entrada_ano int
    declare @saida_mes int
    declare @saida_ano int

    --SET DE VARIAVEIS

    set @entrada_mes = 05
    set @entrada_ano = 2007
    set @saida_mes = 06
    set @saida_ano = 2008
    declare @entrada varchar(100)
    declare @saida varchar(100)

    --SELECT

    set @entrada = cast(@entrada_ano as varchar) + '-' + cast(@entrada_mes as varchar) + '-' + '01'
    set @saida = cast(@saida_ano as varchar) + '-' + cast(@saida_mes as varchar) + '-' + '30'
    select * from treino
    where 
    data_recebimento > cast(@entrada as datetime) 
    and data_saida < cast(@saida as datetime)

    and data_recebimento < data_saida


    Oracle OCA11g, MCC 2011!
    • Marcado como Resposta Eder Costa segunda-feira, 16 de maio de 2011 18:24
    segunda-feira, 9 de maio de 2011 19:03
    Moderador
  • Irei verificar este fato q vc abordou sobre os dados estarem inconsistentes,

    Pois se isso estiver certo nunca teremos resultado alcançado

     

    abraço

    segunda-feira, 9 de maio de 2011 19:09
  • Pois é Brown, verifique o que o Fabrizzio disse, pois analisando o último exemplo que você deu, dos 4 registros apresentados, somente o primeiro possui data de entrada inferior à data de saída, de forma que, aparentemente, sua base está errada.

    Roberson Ferreira


    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    terça-feira, 10 de maio de 2011 03:03
    Moderador
  • Estes 4 exemplos q postei são o resultado da consulta
    terça-feira, 10 de maio de 2011 12:27
  • Brown,

     

    Fugindo um pouco do topico principal da thread, mas para resolvermos, poderia rodar essa query?

     

    SELECT COUNT(*) FROM SuaTabela WHERE SeuCampoEntrada > SeuCampoSaida


    Oracle OCA11g, MCC 2011!
    terça-feira, 10 de maio de 2011 12:39
    Moderador
  • Fala Fabrizzio Bom dia!!!

    Fiz isso ontem , realmente constatei q existem erros na base,  mas a margem de erro é de 6% da base total.

     

    terça-feira, 10 de maio de 2011 12:52
  • brown,

     

    Ok, veja o ultimo script que enviei, ele faz essa comparação e exclui os dados que não estão consistentes em sua tabela. Se puder testa-lo e ver se é realmente o que voce precisa....


    Oracle OCA11g, MCC 2011!
    terça-feira, 10 de maio de 2011 12:56
    Moderador
  • Farei o teste aqui e te retorno

     

    Abraço

    terça-feira, 10 de maio de 2011 14:33
  • Fiz a consulta eliminando o erro

    da diferença de datas rodou

    Agora estou analizando para ver se o resultado é o esperado mesmo

     

    Abraço retorno depois

    terça-feira, 10 de maio de 2011 18:14