none
Pesquisa valor valido pela data RRS feed

  • Pergunta

  • Bom dia a todos!

    Gostaria de uma ajuda referente a consulta com datas.

    Tenho uma tabela com as seguintes informações.

    DATA INICIAL

    VALOR

    2015-05-04

    150

    2015-08-15 

    100

    2015-11-01 

    300

    2016-01-01 

    150

    2016-06-01 

    200

     

    Preciso realizar uma consulta onde eu informe a data e a resposta seja o valor da época.

    Ex: Se consultar alguma data de outubro de 2015, a resposta deverá ser 100, já se consultar uma data de julho de 2016, a resposta deverá ser 200.

    Qual a melhor lógica a se aplicar neste caso?

    Mais uma vez agradeço a todos!!

    sexta-feira, 2 de setembro de 2016 13:35

Respostas

Todas as Respostas

  • Deleted
    sexta-feira, 2 de setembro de 2016 13:37
  • Concordo com o José Diz.

    Isso é consulta SQL Básica, recomendo dar uma estudada no básico e fará isso facilmente


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    sexta-feira, 2 de setembro de 2016 13:49
  • Boa tarde José,

    Acho que não soube me explicar. Não consigo identificar como o Order By ou o Top podem me ajudar.

    Esta tabela é um exemplo do que preciso fazer... já desenvolvi uma solução com uma procedure em que alimento uma tabela temporária com os valores, mês a mês, do quesito procurado, mas procuro algo mais performático e simples.

    Vou colar abaixo outra tabela para tentar exemplificar melhor minha necessidade.

     

    Matricula

    Data_altera

    VALOR

    1

    01/05/2015

    1500

    1

    01/08/2015

    1800

    1

    01/11/2015

    2000

    1

    01/01/2016

    2200

    1

    01/06/2016

    2500

    2

    01/01/2014

    1000

    2

    01/03/2015

    1250

    2

    01/07/2015

    2000

    2

    01/04/2016

    3000

    3

    01/01/2016

    1500

    4

    01/04/2015

    2500

    4

    01/10/2015

    2700

    4

    01/03/2016

    3000

     

     

    Digamos que eu tenha uma tabela com o histórico salarial de alguns funcionários e que eu queira buscar o salário da pessoa de acordo com a data pesquisada, só que na maioria das vezes a data pesquisada não estará na tabela.

     

    Se eu executar, por exemplo, a consulta abaixo, o script não retornará resultados.

     

    select  valor  from tabela where Data_altera =’10/02/2015’ and matricual = 2

     

    Entretanto a resposta que eu necessitaria buscar é 1000, porque a tabela me diz que:

     

    • De 01/01/2014 até 28/02/2015 o salário da matricula 2 foi 1000;
    • De 01/03/2015 até 30/06/2015 o salário da matricula 2 foi 1250;
    • De 01/07/2015 até 31/03/2016 o salário da matricula 2 foi 2000;
    • E de 01/04/2016 até atualmente o salário é 3000.

     

    Realmente não acredito ser uma simples consulta, e se for, realmente não sei o comando ou a lógica necessária para a tornar simples.

     

    Mais uma vez agradeço a ajuda!

    sexta-feira, 2 de setembro de 2016 18:31
  • Acho que não fui claro quanto a resposta e esta foi mal interpretada

    quando você faz a seguinte objeção

    Bom dia a todos!

    Gostaria de uma ajuda referente a consulta com datas.

    Tenho uma tabela com as seguintes informações.

    DATA INICIAL

    VALOR

    2015-05-04

    150

    2015-08-15 

    100

    2015-11-01 

    300

    2016-01-01 

    150

    2016-06-01 

    200

     

    Preciso realizar uma consulta onde eu informe a data e a resposta seja o valor da época.

    Ex: Se consultar alguma data de outubro de 2015, a resposta deverá ser 100, já se consultar uma data de julho de 2016, a resposta deverá ser 200.

    Qual a melhor lógica a se aplicar neste caso?

    Mais uma vez agradeço a todos!!

    Criando essa estrutura em tabela

    IF ( OBJECT_ID('TEMPDB..#Tabela') IS NOT NULL	)
        DROP TABLE #Tabela;	
    
    CREATE TABLE #Tabela
        (
          DataIncial DATE NOT NULL ,
    	  Valor INT
        );
    
    INSERT INTO #Tabela
            ( DataIncial, Valor ) VALUES  
    		('2015-05-04', 150 ),	
    		('2015-08-15', 100 ),
    		('2015-11-01', 300),
    		('2016-01-01', 150),
    		('2016-06-01', 200)
    


    e atentando a sua pergunta as respostas são 

     

    1) SELECT T.Valor FROM #Tabela AS T WHERE T.DataIncial = '2015-08-15'

    2)ou isso

    DECLARE @VariavelData DATE ='2015-08-15'
    SELECT T.Valor FROM #Tabela AS T
    WHERE T.DataIncial =@VariavelData

    3) ou ainda isso 

    DECLARE @DataInicio DATE ='2016-01-01', @DataTermino DATE ='2016-06-01'

    SELECT T.Valor FROM #Tabela AS T
    WHERE T.DataIncial BETWEEN  @DataInicio AND @DataTermino

    foi nesse sentido de enxergando algo muito simples e colocando entre aspas "se for o caso " (de ser um estudando de faculdade)

    isso fica muito parecido a trabalho de faculdade , onde o aluno lendo as 10 primeiras paginas de qualquer apostila de sql faz.

    acredito que o intuito meu não foi te ofender ou muito menos te menosprezar , e sim apenas de alertar.

    Wesley Neves


    • Editado Wesley Neves sexta-feira, 2 de setembro de 2016 18:59 replica
    sexta-feira, 2 de setembro de 2016 18:53
  • Boa tarde,

    Daniel, experimente fazer uns testes mais ou menos dessa forma:

    select top(1) Valor 
    from Tabela
    where 
        Matricula = 2 and
        Data_altera <= '10/02/2015'
    order by 
        Data_altera desc

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 2 de setembro de 2016 19:22
  • veja se isso resolve

    IF ( OBJECT_ID('TEMPDB..#Tabela') IS NOT NULL )
        DROP TABLE #Tabela;

    SET LANGUAGE 'Brazilian'
    CREATE TABLE #Tabela
        (
     Matricula INT ,
          Data_altera DATE NOT NULL ,
     Valor INT
        );

    INSERT INTO #Tabela
            (Matricula ,Data_altera, Valor ) VALUES  
    (1,'01/05/2015', 1500 ),
    (1,'01/08/2015', 1800 ),
    (1,'01/11/2015', 2000),
    (1,'01/01/2016', 2200),
    (1,'01/06/2016', 2500),
    (2,'01/01/2014', 1000),
    (2,'01/03/2015', 1250),
    (2,'01/07/2015', 2000),
    (2,'01/04/2016', 3000),
    (3,'01/01/2016', 1500),
    (4,'01/04/2015', 2500),
    (4,'01/10/2015', 2700),
    (4,'01/03/2016', 3000)

    SELECT * FROM #Tabela AS T

    DECLARE @DataInicio DATE ='01/01/2014',@DataTermino DATE ='28/02/2015'

    SELECT T.Valor FROM #Tabela AS T
    WHERE T.Data_altera  BETWEEN @DataInicio AND @DataTermino
    AND T.Matricula =2


    Wesley Neves

    Sobre o formado de data  se o seu insert estiver nesse formato "06/03/2013" o resultado sera esse no banco '2013-06-03'

    como demostro abaixo

    SET LANGUAGE 'Brazilian'
    select @@LANGUAGE
    SELECT CAST(' ' AS DATE) [FULLDATE], MONTH(CAST('06/03/2013' AS DATE)) [MONTH], DAY(CAST('06/03/2013' AS DATE)) [DAY]
     
    SET LANGUAGE 'English'
    select @@LANGUAGE
    SELECT CAST('06/03/2013' AS DATE) [FULLDATE], MONTH(CAST('06/03/2013' AS DATE)) [MONTH], DAY(CAST('06/03/2013' AS DATE)) [DAY]
    • Editado Wesley Neves sexta-feira, 2 de setembro de 2016 19:58 adendo
    sexta-feira, 2 de setembro de 2016 19:51
  • Deleted
    sexta-feira, 2 de setembro de 2016 20:49
  • Bom dia,

    Devido a falta de resposta do usuário
    essa thread está sendo fechada.
    Se o problema ainda estiver ocorrendo,
    favor abrir uma nova thread.

    Atenciosamente,


    Robson William Silva

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    segunda-feira, 5 de setembro de 2016 13:48