Array
(
)

Todas as horas do dia em uma consulta

José
   - 16 dez 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.

Faabiianooc
   - 16 dez 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.

José
   - 16 dez 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

Marcos P
   - 16 dez 2015

Adapte a partir dessa ideia...

#Código

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

José
   - 16 dez 2015

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

Faabiianooc
   - 16 dez 2015

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

José
   - 16 dez 2015

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

Marcos P
   - 16 dez 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á...

Jothaz
   - 16 dez 2015

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

José
   - 06 jan 2016

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

Nenhuma delas deu certo, tentei todas.

José
   - 06 jan 2016

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

Marcos P
   - 06 jan 2016


Citação:

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.

José
   - 06 jan 2016

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

Obrigado pela ajuda.

Marcos P
   - 06 jan 2016


Citação:

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


SqlFiddle

José
   - 06 jan 2016

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

Marcos P
   - 06 jan 2016

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

Marcos P
   - 06 jan 2016

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

José
   - 06 jan 2016

Assim que sobrar tempo eu crio lá beleza ?

Muito obrigado.

José
   - 07 jan 2016

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

Marcos P
   - 07 jan 2016

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

José
   - 07 jan 2016

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