Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
Clever_Anjos
Employee
Employee

Campos data/hora, também conhecidos como "Monstros S/A"

No filme "Monstros S/A" os personagens são treinados para assustarem as crianças. Eles ficam lá, à espreita, esperando a hora certa de aterrorizar os pequenos humanos.


Em Qlik existe também um cenário onde um pequeno "monstro" fica à espreita para nos assustar.


Mas primeiro vamos a um pouco de teoria sobre como datas, horas e intervalos são armazenados em Qlik. Leitura recomendada by hic


As funções date() e time() são apenas funções de formatação.

Elas não alteram o valor do número que recebem como argumento. Elas apenas aplicam uma "máscara" a um valor de data/hora

Se você incluir em um objeto texto a expressão =time(now()) verá algo semelhante a isso

Capturar.PNG

Você está vendo apenas a hora:min:seg mas o valor do dia "ainda está lá" esperando para assustar você.

Se você incluir em um objeto texto a expressão =date(now()) verá algo semelhante a isso

Capturar.PNG

Você está vendo apenas a data mas as horas e minutos continuam lá.

images?q=tbn:ANd9GcTaeFK9RkQM00A7cbfc2iI3C573rSkbsubdyrY-ZZnT4jk0O_cB

Várias vezes vemos posts aqui na comunidade de diferenças estranhas quando somam-se ou calculam-se médias de campos data/hora.

Exemplo:

Sum(Aggr(time(DataHoraFim)-time(DataHoraInicio),Atendimento) parece certo não?

Para cada atendimento, calcula-se a diferença entre a data final e data inicial e soma-se para todos os atendimentos.

Mas e se?

Capturar.PNG

Percebeu a diferença? Quando aplica-se um time() a um valor de 34:52:20 a função "arredonda" para 24 horas e mostra apenas 10:52:20, "escondendo" 24 horas no armário. Mas aquelas horas continuam lá e quando somamos ou calculamos média o valor fica distorcido. Você vê um valor, mas valor armazenado é outro, mascarado pelas funções.


Utilize as seguintes regrinhas:

  • Quer apenas a parte data de um campo? Utilize Date(Floor(Seucampo))
  • Quer apenas as horas de um campo? Utilize Time(Frac(Seucampo))
  • Está fazendo um cálculo entre datas que pode resultar em mais de 24 horas? Formate com Interval() que não vai deixar os valores "escondidos"
4 Replies
TiagoCardoso
Creator II
Creator II

Belo artigo cleveranjos, muito útil.

Obrigado e abraços.

Not applicable

Legal, mas Clever estou com um problemas justamente com datas e não estou conseguindo resolver, fico horas estudando sou novato no qlikview e ainda apanho muito com tudo isso.

Estou tento problemas porque esta trazendo do Oracle datas inferiores a data da variavel tipo na variavel carrega 04/10/216 e vem informação do Oracle tipo do mês 4 exemplo: 11/04/2016

No Oracle a data vem 15/04/2008 14:25:25 e no qlikview a data que esta na variavel 4/10/2016

Tem como dar um help brother??

Quando carrego esse script

//Uso isso para trazer a ultima data carregada no qvd

tmp:

load

max(HIS_DATAHORA) as HIS_DATAHORA

FROM

(qvd);

//variavel para carregar a ultima data na consulta, realizada no banco oracle de onde devo extrair as atualizações diarias

let vData = date(peek('HIS_DATAHORA',0,tmp),'DD/MM/YYYY');

drop table tmp;

//consulta simples para receber as informações e depois concatenar com o qvd

SELECT * FROM HISTORICO H

WHERE

h.his_pro_cod ='CCF'

and h.his_datahora >= '$(vData)'

and rownum <100

;

Clever_Anjos
Employee
Employee
Author

O mais correto seria ter aberto um tópico.

Acredito que seja como o seu Oracle está interpretando suas Datas na sua Query.

Altere por favor:

1) h.his_datahora >= '$(vData)'  para h.his_datahora >= TO_DATE('$(vData)','DD/MM/YYYY')

2) SELECT * FROM HISTORICO // Não use o * inclua somente os campos que vai precisar, acredite você poderá ter problemas no futuro

Not applicable

Valew Clever!