Todas as horas do dia em uma consulta

SQL Server

Oracle

SQLite

16/12/2015

Tenho a seguinte consulta, ela pega as temperaturas no dia e vai jogando no banco.

Porém ela só pega as temperaturas em horas especificas do dia eu preciso que ele pegue do dia todo, exemplo as 09 horas não tenha nenhuma medição que no resultado da consulta aparece NULL NULL NULL NULL NULL 09.


select
fcm.SEQUENCIA SEQUENCIA,
fcm.TEMPERATURA1 TEMP1,
fcm.TEMPERATURA2 TEMP2,
fcm.TEMPERATURA3 TEMP3,
fcm.TEMPERATURA4 TEMP4,
fcm.TEMPO_MILIS,
TO_DATE('01/01/1970','dd/mm/yyyy')+(fcm.TEMPO_MILIS/1000/60/60/24)/*GMT-2)*/-1/12 /* GMT-2*/ data,
to_char(TO_DATE('01/01/1970','dd/mm/yyyy')+(fcm.TEMPO_MILIS/1000/60/60/24),'dd/mm/yyyy') data2,
to_char(TO_DATE('01/01/1970','dd/mm/yyyy')+(fcm.TEMPO_MILIS/1000/60/60/24)-1/12,'HH24') hora
from medicioes_temperaturas fcm,
terminais_ativios fct
where fcm.id_ativo = fct.id
and fct.id = :p_pasteurizador
and TO_DATE('01/01/1970','dd/mm/yyyy')+(fcm.TEMPO_MILIS/1000/60/60/24)-1/12 between :p_data_inicial and :p_data_final
and fcm.status_prod = :p_status_prod
group by TO_DATE('01/01/1970','dd/mm/yyyy')+(fcm.TEMPO_MILIS/1000/60/60/24)/*GMT-2)*/-1/12 /* GMT-2*/,
fcm.SEQUENCIA ,
fcm.TEMPERATURA1 ,
fcm.TEMPERATURA2 ,
fcm.TEMPERATURA3 ,
fcm.TEMPERATURA4 ,
fcm.TEMPO_MILIS
order by to_char(TO_DATE('01/01/1970','dd/mm/yyyy')+(fcm.TEMPO_MILIS/1000/60/60/24)-1/12,'HH24');


Resultado:

1 73,36 73,11 4,28 1448351855827 24/11/15 05:57:36 24/11/2015 05
1 73,22 73,2 4,94 1448350745578 24/11/15 05:39:06 24/11/2015 05
1 72,76 72,62 4,88 1448350835587 24/11/15 05:40:36 24/11/2015 05
1 72,8 72,54 4,85 1448350865590 24/11/15 05:41:06 24/11/2015 05
1 73,49 73,16 4,71 1448351045609 24/11/15 05:44:06 24/11/2015 05
1 73,13 73 4,67 1448351145619 24/11/15 05:45:46 24/11/2015 05
1 73,09 72,97 4,67 1448351155620 24/11/15 05:45:56 24/11/2015 05
1 73,07 72,92 4,67 1448351165621 24/11/15 05:46:06 24/11/2015 05
1 73,36 73,03 4,6 1448351385643 24/11/15 05:49:46 24/11/2015 05
1 73,39 73,1 4,55 1448351455699 24/11/15 05:50:56 24/11/2015 05
1 73,36 73,1 4,55 1448351465700 24/11/15 05:51:06 24/11/2015 05
1 73,24 73,03 4,51 1448351565763 24/11/15 05:52:46 24/11/2015 05
1 73,21 73 4,41 1448351605802 24/11/15 05:53:26 24/11/2015 05
1 73,21 72,98 4,36 1448351645806 24/11/15 05:54:06 24/11/2015 05
1 73,21 72,94 4,34 1448351655807 24/11/15 05:54:16 24/11/2015 05
1 73,24 72,94 4,32 1448351695811 24/11/15 05:54:56 24/11/2015 05
1 73,27 72,98 4,34 1448351725814 24/11/15 05:55:26 24/11/2015 05
1 73,3 73 4,34 1448351755817 24/11/15 05:55:56 24/11/2015 05
1 73,32 73,04 4,32 1448351765818 24/11/15 05:56:06 24/11/2015 05
1 73,42 73,06 4,32 1448351815823 24/11/15 05:56:56 24/11/2015 05
1 73,36 73,06 4,31 1448351825824 24/11/15 05:57:06 24/11/2015 05
1 73,34 73,13 4,32 1448351835825 24/11/15 05:57:16 24/11/2015 05
1 73,27 73,03 4,24 1448351975839 24/11/15 05:59:36 24/11/2015 05

O que eu preciso:

NULL NULL NULL NULL NULL NULL 09 Apenas mostrando as horas.

Porque você quer isso ?

Vou jogar em um XML e isso vai me gerar um gráfico das temperaturas! Se puderem fico muito agradecido.
José

José

Curtidas 0

Respostas

Fabiano Carvalho

Fabiano Carvalho

16/12/2015

Entendi nada rs.
O que você deseja de resultado final? Expliqe o cenário atual e o que deseja de resultado final.

Imagino que seja possível realizar o que deseja.
GOSTEI 0
José

José

16/12/2015

Beleza,


É o seguinte você está vendo o resultado da consulta certo? Ela pega as temperaturas em algumas horas do dia em um aparelho e joga no banco. A consulta acima mostra as temperaturas e as horas do dia que foram capturadas. Eu preciso jogar isso em um XML e gerar um gráfico. Para esse gráfico ficar melhor o ideal seria que a consulta retornasse todas as horas tô dia.

Exemplo aquele resultado ali em nenhum momento tem a medição de temperatura as 09, 10 horas. Então que aparece todos os campos NULL e apenas a hora.

Exemplo :

NULL NULL NULL NULL NULL NULL 9

9= HORAS
GOSTEI 0
Marcos P

Marcos P

16/12/2015

Adapte a partir dessa ideia...

select medida1, medida2, medida3, medida4, medida5, medida6, 0 as Hora from tabela where Hora = 0
union all
select medida1, medida2, medida3, medida4, medida5, medida6, 1 as Hora from tabela where Hora = 1
union all
select medida1, medida2, medida3, medida4, medida5, medida6, 2 as Hora from tabela where Hora = 2
union all
select medida1, medida2, medida3, medida4, medida5, medida6, 3 as Hora from tabela where Hora = 3
union all
:
select medida1, medida2, medida3, medida4, medida5, medida6, 22 as Hora from tabela where Hora = 22
union all
select medida1, medida2, medida3, medida4, medida5, medida6, 23 as Hora from tabela where Hora = 23


P.S.: Sempre que inserir código no fórum, utilize a tag <Inserir Codigo>.
GOSTEI 0
José

José

16/12/2015

O problema de usar o metodo acima é que eu não tenho uma tabela com todas as horas, já havia pensando dessa forma.
GOSTEI 0
Fabiano Carvalho

Fabiano Carvalho

16/12/2015

E porque voce não cria uma com todas?
Utilize left,right para trazer todas as horas independente se existe ou nao apontamento.
GOSTEI 0
José

José

16/12/2015

Infelizmente não vou ter autoridade pra isso aqui no banco. : (
GOSTEI 0
Marcos P

Marcos P

16/12/2015

Crie um cursor que recupere as "horas" disponiveis.

Depois disso, navegue pelo cursor sequencialmente das 0 as 23 horas.

Se existirem registros naquela "hora" você apresenta os resultados disponíveis.

Caso contrário, apresenta zero ( ou nulo ) para aquela hora.

Outra alternativa : crie uma temporária com TODAS as horas do dia... depois faça LEFT / RIGHT JOIN dessa temporária com teus dados. As horas com dados, você mostra. As horas sem dados, você apresenta zero ( ou nulo ).

Se precisar de ajuda, crie a estrutura da tabela e coloque alguns registro no SqlFiddle que te ajudo por lá...
GOSTEI 0
Jothaz

Jothaz

16/12/2015

Você não tem permissão nem para criar uma tabela temporária?
GOSTEI 0
José

José

16/12/2015

Não, não posso criar nem uma tabela temporária ...

Nenhuma delas deu certo, tentei todas.
GOSTEI 0
José

José

16/12/2015

Seria mais ou menos o seguinte exemplificando um pouco melhor, eu preciso retornar todas as horas do dia para depois gerar um gráfico.
Basicamente o resultado deve ser
TEMP 1, TEMP 2, TEMP 3, TEMP 4 HORA
5 6 8 1 15
3 5 8 0 16
NULL NULL NULL NULL NULL
GOSTEI 0
Marcos P

Marcos P

16/12/2015


Crie um cursor que recupere as "horas" disponiveis.

Depois disso, navegue pelo cursor sequencialmente das 0 as 23 horas.

Se existirem registros naquela "hora" você apresenta os resultados disponíveis.

Caso contrário, apresenta zero ( ou nulo ) para aquela hora.
GOSTEI 0
José

José

16/12/2015

Não entendo muito da criação de cursores ? me indicaria algo ?

Obrigado pela ajuda.
GOSTEI 0
Marcos P

Marcos P

16/12/2015


Se precisar de ajuda, crie a estrutura da tabela e coloque alguns registro no SqlFiddle que te ajudo por lá...


SqlFiddle
GOSTEI 0
José

José

16/12/2015

E como vou fazer o select de todas as horas se eu não tenho essa informação em tabela nenhuma ?
GOSTEI 0
Marcos P

Marcos P

16/12/2015

Cara, é o seguinte... se você quer que eu te ajude, crie a estrutura das tabelas e popule-as com alguns registros que simulem os dados do teu ambiente real.

O resto eu faço !

SqlFiddle
GOSTEI 0
Marcos P

Marcos P

16/12/2015

Se quiser criar apenas uma tabela com os exemplos, também está valendo...
GOSTEI 0
José

José

16/12/2015

Assim que sobrar tempo eu crio lá beleza ?


Muito obrigado.
GOSTEI 0
José

José

16/12/2015

O problema de agora,
as horas que não há medidas não ha dado nenhum na tabela, o que complica mais as coisas.
GOSTEI 0
Marcos P

Marcos P

16/12/2015

Quem está complicando as coisas é você... sua necessidade não é selecionar as temperaturas ( hora-a-hora ), mostrando a hora mesmo quando não existe registro de temperatura naquela hora ?

Crie uma tabela com cinco colunas ( T1, T2, T3, T4 e HORA ) e insira alguns registros de teste.

Eu monto o cursor e você, depois, o adapta ao seu ambiente.

Não tem nada de complicado nisso...
GOSTEI 0
José

José

16/12/2015

Alguém sabe aumentar o eixo X em um RTF ? Gráfico é aumentando em uma imagem ...
GOSTEI 0
POSTAR