Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

vagner.gomes

Intervalo de números

Recommended Posts

Olá, caros!

 

Preciso de uma ajuda que, a princípio parece simples, mas na prática não está saindo conforme o planejado.

Trabalho com um banco temporal, onde qualquer pesquisa é necessário selecionar o intervalo de tempo desejado, nesse banco tem uma tabela com praticamente todos os dados, onde

faço pesquisa pelas TagName's.

Pois bem, preciso fazer uma pesquisa que me retorne apenas os números que estão dentro de um intervalo de números.

 

Exemplo:

Preciso pega apenas os numeros que estão entre o intervalo de 20 até  41, reparem que o numero 27 se repete duas vezes, mas na consulta ele deveria

aparecer apenas uma vez, pois preciso apenas daquele que está dentro do intervalo.

ID     Valor                    Data

 1        27       2017-03-01 00:00:00

 2        40       2017-03-01 02:05:00

 3        41       2017-03-01 05:10:00

 4        20 -     2017-03-01 08:28:00

 5        21       2017-03-01 12:36:05

 6        23       2017-03-01 13:00:00

 7        27       2017-03-01 14:02:00

 8        40       2017-03-01 14:05:00

 9        41 -     2017-03-01 18:03:00

10      42        2017-03-01 19:05:00

11      18        2017-03-01 22:00:00

12      20        2017-03-01 23:59:59

 

Então o retorno seria: 20, 21, 23, 27, 40, 41.

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
SELECT DISTINCT ID

FROM TABELA

WHERE ID BETWEEN 20 AND 41

Se entendi o problema ...

Compartilhar este post


Link para o post
Compartilhar em outros sites
4 minutos atrás, Motta disse:

SELECT DISTINCT ID

FROM TABELA

WHERE ID BETWEEN 20 AND 41

Se entendi o problema ...

Na verdade, podem existir valores iguais, porém quero pegar apenas os valores que estão entre os intervalor dos número 20 a 41, porém ele me retorna todos os que são maiores que 20 e menores que 41.

 

Vamos imaginar que não é obrigatório os numero estarem em uma ordem exata, porém em certos momentos eles vão estar:

--> 27 - '20 - 21 - 22 - 27 - 41' - 23 - 25 - 27 - 40 - 41 - '20 - 27 - 41' - 18 - 17 -->

Da sequencia de numeros acima apareceram alguns repetidos, isso não é problema. Porém, preciso pegar apenas os numero que aparecem entre

os numeros 20 e o 41. Sendo assim, a partir da sequencia acima, serao selecionados os numeros: '20 - 21 - 22 - 27 - 41' e também os numeros: '20 - 27 - 41', pois nesse caso tenho dois intervalos que vao de 20 ao 41.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sql usado, nele tenho que definir o periodo de tempo, pois o banco é temporal e historizado. Logo após, defino entre o intervalo de numeros que quero que busque (de 20 a 41), pois cada intervalo é um ciclo do equipamento.

Os numero não podem alterar sua posicao, tanto em crescente como em decrescente, porque isso é definido pelo seu horario de registro:

 

--> 27 - '20 - 21 - 22 - 27 - 41' - 23 - 25 - 27 - 40 - 41 - '20 - 27 - 41' - 18 - 17 -->

SELECT 
     CONVERT (varchar( 10 ), TagName) AS Tagname,
     DateTime AS data,
     Value AS passo

FROM  History

WHERE Tagname = 'Equipamento.Passo'
      AND DateTime BETWEEN '2017-03-15 00:00:00.000' 
                 AND '2017-03-15 23:59:59.999'
      AND Value BETWEEN 20 AND 41
      AND Value IS NOT NULL

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos ver se entendi , "20" inicia um ciclo e '41' o encerra.

 

A questão seria , num intervalo de tempo , localizar o '20' com a menor data/hora e o maior '41' com a maior data/hora , isto fecharia o ciclo , com base nisto clacular o intervalor de tempo

 

 9        41 -     2017-03-01 18:03:00

 4        20 -     2017-03-01 08:28:00

 

seriam então 09:35:00h

 

 

Este é o problema retornar este tempo ?

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quase isso Motta, você entendeu, só que ao invés de retornar o tempo, retorna apenas os numero dentro desse ciclo. O intervalo de tempo é apenas 24 horas, de 00:00:00 até 23:59:59 do mesmo dia, dentro desse dia pode acontecer varios ciclos, e esses ciclo sempre iniciam no Valor 20 e terminam no Valor 41. Entao preciso pegar os numeros que estao dentro de cada ciclo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente buscar entre a menor data de valor 20 e a maior data de valor 41 , o problema é quando existirem mais de um intervalo no mesmo dia.

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Será que um array pra percorrer a lista de numeros dentro de 24 horas, identificando o 20 como início e o 41 como final. Toda vez que achar o 20 e depois achar o 41 sem interrupcao de outro vinte entre os dois, fecha o ciclo e guarda os numero entre esses pontos. Acha que daria certo dessa forma?

Compartilhar este post


Link para o post
Compartilhar em outros sites

SERIA ALGO ASSIM

 

SELECT
     CONVERT (varchar( 10 ), TagName) AS Tagname,
     DateTime AS data,
     Value AS passo
FROM  History H1
WHERE Tagname = 'Equipamento.Passo'
      AND DateTime BETWEEN (SELECT MIN(DateTime) FROM  History H2
                              WHERE H2.Tagname = H1.Tagname
                              AND H2.DateTime BETWEEN '2017-03-15 00:00:00.000'
                                           AND '2017-03-15 23:59:59.999'
                              AND H2.Value  = 20  )
                   AND (SELECT MAX(DateTime) FROM  History H3
                          WHERE H3.Tagname = H1.Tagname
                         AND H3.DateTime BETWEEN '2017-03-15 00:00:00.000'
                                       AND '2017-03-15 23:59:59.999'
                          AND H3.Value  = 41)
      AND Value BETWEEN 20 AND 41
      AND Value IS NOT NULL

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta, desculpe pela demora em responder.

Testei seu código e funcionou perfeitamente, muito obrigado mesmo cara!

 

Agora vou trabalhar em algumas alterações pois preciso retornar quantas vezes esse ciclo de 20 a 41 acontece durante todos os dias do mes.

Abaixo está o código final, falta alguns ajustes que estou resolvendo:

SELECT  *
        FROM (
 
SELECT  
     CONVERT (varchar( 10 ), TagName) AS Tagname,
     Value AS passo,
     ( 'dia' + CONVERT( varchar, DAY( DateTime ) ) ) AS Dia,
        COUNT( * ) AS Quantidade
    
FROM  History AS H1
WHERE Tagname = 'Equipamento.passo'
      AND DateTime BETWEEN (SELECT MIN(DateTime) FROM  History AS H2
                              WHERE H2.Tagname = 'Equipamento.passo'
                              AND H2.DateTime BETWEEN '2017-03-01 00:00:00.000'
                                           AND '2017-03-31 23:59:59.999'
                              AND H2.Value  = 20  )  
                   AND (SELECT MAX(DateTime) FROM  History AS H3
                          WHERE H3.Tagname = 'Equipamento.passo'
                         AND H3.DateTime BETWEEN '2017-03-01 00:00:00.000'
                                       AND '2017-03-31 23:59:59.999'
                          AND H3.Value  = 41)
      AND Value BETWEEN 20 AND 41
      AND Value IS NOT NULL
      AND Value = 27
 
 
          GROUP BY DAY( DateTime ), TagName, Value    
    ) AS U
 
    PIVOT (  
        SUM( Quantidade )  
        FOR dia IN ( dia1, dia2, dia3, dia4, dia5, dia6, dia7, dia8, dia9,  
        dia10, dia11, dia12, dia13, dia14, dia15, dia16, dia17, dia18, dia19, dia20,  
        dia21, dia22, dia23, dia24, dia25, dia26, dia27, dia28, dia29, dia30, dia31 )  
    ) AS P  


   

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por mamotinho
      Olá, estou a um tempo tentando acrescentar um codigo na coluna do SQL na qual seria VARBINARY

      A Coluna atual contém o seguinte codigo binary:
      Código (01)
      0x020009004C0101434D0101465C0101485D0101499801014B8401014E8501014F86010150D00009017A0014247D0014257B0014261600090201000903F9001420FA0014229F000923F8001427DF000128730014297600142A7E00142BFB00142CA3010147E000142DE100142EA40101443900120424001405C40101457400142F770014307F0001317C001232E6000421780001332C010A522F0108533A010354380103553001085637010357A5010166A6010167  
      No codigo acima eu gostaria de acrescentar o seguinte codigo:
      Código (02)
      0xCC010120CD010121CE010122CF010123
      no caso eu quero criar uma procedure que ao executar a função ele adicione o codigo 02 no código 01. no caso o codigo ficaria desta forma:

      0x020009004C0101434D0101465C0101485D0101499801014B8401014E8501014F86010150D00009017A0014247D0014257B0014261600090201000903F9001420FA0014229F000923F8001427DF000128730014297600142A7E00142BFB00142CA3010147E000142DE100142EA40101443900120424001405C40101457400142F770014307F0001317C001232E6000421780001332C010A522F0108533A010354380103553001085637010357A5010166A6010167CC010120CD010121CE010122CF010123



      Ficarei imensamente grato se alguém conseguir me ajudar, o orientar. sou iniciante nessa areá ainda.
    • Por tanaka_
      Gostaria de saber se é possível listar todos os objetos criados no banco de dados por usuário especifico.
      Não é para listar os "dbo" e sim o usuário logado que criou o objeto.
       
      Usuário logado:
      select SYSTEM_USER
       
      Todos os objetos criados:
      select * from sys.all_objects
    • Por tanaka_
      Gostaria de saber se é possível listar todos os objetos criados no banco de dados por usuário especifico.
      Não é para listar os "dbo" e sim o usuário logado que criou o objeto.
       
      Usuário logado:
      select SYSTEM_USER
       
      Todos os objetos criados:
      select * from sys.all_objects
    • Por Kellison Ruan
      Acho que não fui tão claro no título, portanto irei esmiuçar melhor aqui...
       
      É o seguinte, quero saber se há algum jeito de pegar as linhas de uma coluna q está em VARCHAR com informações do tipo "4 PONTOS DE ILUMINAÇÃO", dessa informação pretendo retirar somente o número que em questão é o "4" e colocá-lo em outra coluna INTEGER. Há essa possibilidade? Detalhe, as vezes as informações não está seguindo um padrão de vim somente como "4 PONTOS DE ILUMINAÇÃO" às vezes vêm dados com mais informações númericas que precisa distinguir, por exemplo, a mim só interessa pegar números que vem antecedendo as palavras "PONTOS", "PTOS", "PTS", têm algum jeito de distinguir isso?
    • Por carlos melo
      Boa noite, trabalho com Delphi e estou tendo dificuldade em fazer conexão com meu servidor que esta na argentina, uso o firedac para fazer a conexão com o banco, so que o comando que estou utilizando esta dando erro e não sei se estou configurando certo a minha query.
       
      Ja criei os linked server e tambem não resolveu......
       
       uso um select dentro do delphi dessa maneira : 
      DELPHI
      FDQuery e dentro uso esse select
      Select * from [192.168.XX.XXX].banco.dbo.tabela direcionando para o meu servidor que esta na argentina sendo 192.168.xx.xxx o ip do servidor de la e o nome do banco é servicos e a tabela ordens.
       
      Se alguem conhece ou ja fez esse tipo de conexão , estou precisando dessa grande ajuda...
       
      obrigado
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.