[BIRT] Problemas com datas em outubro

Pessoal, estou com um sério problema no BIRT.

Se a minha consulta for SELECT TO_DATE( '19/10/2009', 'DD/MM/RRRR' ) FROM DUAL, o resultado retornado pelo BIRT é 18/10/2009 23:00:00. E isso ocorre somente no período 19/10/2009 a 01/11/2009, depois fica tudo certo.
O engraçado é que, usando o iReport, a mesma consulta funciona normalmente.

Por que será que isso ocorre? Alguém sabe (ou tem qualquer ideia) de como resolver isso?
Obs.: estou utilizando BIRT 2.2.1 e Oracle 10g.
Obrigado desde já.

É o famoso problema do horário de verão. Em que dia e horário mudou?

Pelas regras do governo (e do Java), após 17/10/2009 23:59:59 o próximo minuto é 18/10/2009 01:00:00. Mas dá a impressão que alguma coisa (o banco, que não sei se está com a mesma data de horário de verão que seu Java, ou o BIRT, ou sei lá o quê) acha que após 17/10/2009 23:00:00 o próximo minuto é 18/10/2009 00:00:00.

Em primeiro lugar, muito obrigado pela resposta.

O que está acontecendo é bem isso que tu citaste, no entanto, não entendi por que diabos no iReport funcionou perfeitamente.
Além disso, se eu utilizar a função to_char (para retornar uma string, no Oracle) com formato ‘dd/mm/rrrr’, aí o BIRT também retorna de forma correta o a data 19/10/2009.

O detalhe é que é inviável eu fazer isso em todos os relatórios que possuímos, que estão sendo desenvolvidos desde dezembro e já somam mais de 180… Conhece alguma solução para esse bug do BIRT?
Obrigado.

você utiliza JRE da Sun? se sim, tente fazer o download do Timezone Updater Tool e executá-lo.

Prezado Bruno,

Já tive sérios problemas com aplicações java e datas. Acredito que o seu problemas pode estar associado a:

  1. Horário de verão;

  2. Driver jdbc desatualizado:
    Verifique no site da oracle a versão mais atual do OJDBC. Procure no seu PC qualquer arquivo com nome classes12.zip e apague. Esse driver é antigo e foi feito para jdk 1.1, 1.2 e 1.3 se não me engano.

  3. Existem bugs conhecidos com os driver da oracle. Eu mesmo tive um problema parecido com o seu para uma data específica que só foi resolvido pelo suporte “pago” via metalink. O pessoal marretou a data e acredito que exitam uma lista de datas que tenham esse problema.

Espero ter ajudado,

Geraldo.

[quote=wbdsjunior]você utiliza JRE da Sun? se sim, tente fazer o download do Timezone Updater Tool e executá-lo.
[/quote]
Baixei, executei e o problema continua… :frowning:

[quote=geraldo@pentalink.com.br]1) Horário de verão;
2) Driver jdbc desatualizado:
Verifique no site da oracle a versão mais atual do OJDBC. Procure no seu PC qualquer arquivo com nome classes12.zip e apague. Esse driver é antigo e foi feito para jdk 1.1, 1.2 e 1.3 se não me engano.
3) Existem bugs conhecidos com os driver da oracle. Eu mesmo tive um problema parecido com o seu para uma data específica que só foi resolvido pelo suporte “pago” via metalink. O pessoal marretou a data e acredito que exitam uma lista de datas que tenham esse problema. [/quote]

  1. Tem alguma ideia de como posso resolver se o problema for este?
  2. Estou utilizando a última versão do OJDBC, que é a 5…
  3. Será que meu caso seria este?

Obrigado pela ajuda galera, mas infelizmente ainda não consegui nada e estou desesperado já…

Olá Bruno,

Às vezes acontece de você estar com vários arquivos ojdbc.jar na máquina e em runtime a JVM pegar uma versão diferente. Mas acredito não ser esse o seu caso.

De qualquer forma a definição de quando começa o horário de verão no Brazil ainda é uma decisão política. Então não há como tratar isso genericamente, pelo menos acho que não.

Acredito que a data no banco de dados esteja gravada com minutos. Mesmo que você esteja recuperando apenas o dia, mês e ano, tem informação de minuto lá.

Vou dar uma sugestão meio “toska”. Aí fica seu critério de testar aí no seu ambiente. Se for ambiente de produção então precisa ser testado.

Como a data que você tá falando se refere realmente ao dia de virada do horário de verão, executa um update para mudar todos os registros para a data 19/10/2009 onde a data for 18/10/2009 e a hora for maior que 23:00 H. Não sei se sua aplicação permite que você faça isso, mas pelo menos resolve o problema.

Outra alternativa e você usar as classes java para tratar isso. Acredito que Calendar e Locale pode te ajudar.

T+

Geraldo.

Obrigado pela ajuda, mas meu caso não é este, pois tenho certeza de que todas as datas no banco são armazenadas com dia fechado, sem nada de horário.

Como falei no primeiro post, estranhei isso tudo pois, utilizando o iReport, a data 19/10 é mostrada perfeitamente, o erro só acontece com o BIRT.

Olá Bruno,

Para dar essa diferença, eu acredito que a data tem informações de hora, minuto e segundos. O fato de você estar recuperando apenas dia, mês e ano é apenas uma questão de formatação. Faça um SQL formatado que mostre as informações de hora e minuto que deve aparecer informações referentes a isso.

Qual banco você está usando? Oracle? E o BIRT é um programa java?

Geraldo.

Como já disse, eu tenho certeza de que minhas datas do banco estão com horário zerado pois já as conferi.
Além do mais, como eu disse no primeiro post, utilizo Oracle e a consulta que estou fazendo para testar é simplesmente um “select XXX from dual”. “Dual”, no Oracle, é a mesma coisa que usar “SELECT ‘teste’” no MySQL.

Mas o problema, como eu também já disse, não ocorre ao fazer a seleção, ocorre somente ao mostrar o valor no BIRT, que é um gerador de relatórios do Eclipse.

Bom,

Então você pode dar uma olhada no engine no BIRT para ver se ele tem algum driver JDBC próprio. Se você testou numa aplicação em java e o resultado deu certo, parece que o problema está no BIRT mesmo.

Obs: Mas cuidado porque driver jdbc engana muito. Às vezes em runtime ele carrega uma versão diferente do driver principalmente em aplicações WEB onde o pessoal empacota um monte de jar sem ter controle sobre as versões.

Bom, como não conheço o BIRT não poderei ajudar muito então.

T+

Geraldo.