Todas as horas do dia em uma consulta

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.

Respostas

16/12/2015

Fabiano Carvalho

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.
Responder Citar

16/12/2015

José

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
Responder Citar

16/12/2015

Marcos P

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>.
Responder Citar

16/12/2015

José

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

16/12/2015

Fabiano Carvalho

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

16/12/2015

José

Infelizmente não vou ter autoridade pra isso aqui no banco. : (
Responder Citar

16/12/2015

Marcos P

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á...
Responder Citar

16/12/2015

Jothaz

Você não tem permissão nem para criar uma tabela temporária?
Responder Citar

06/01/2016

José

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

Nenhuma delas deu certo, tentei todas.
Responder Citar

06/01/2016

José

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
Responder Citar

06/01/2016

Marcos P

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.
Responder Citar

06/01/2016

José

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

Obrigado pela ajuda.
Responder Citar

06/01/2016

Marcos P

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


SqlFiddle
Responder Citar

06/01/2016

José

E como vou fazer o select de todas as horas se eu não tenho essa informação em tabela nenhuma ?
Responder Citar

06/01/2016

Marcos P

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
Responder Citar