Aprenda PL/SQL

MS Excel usa um formato de data chamado “Serial Date format” ao armazenar e lidar com datas e horas. A “Data serial” é calculada pegando o número de dias entre uma data qualquer e o dia 01/01/1900.

Por que isso é importante para um desenvoledor Oracle ? Se você está criando um documento em PL/SQL que será aberto no Excel, a data ficará incorreta a não ser que você converta antes para o padrão do Excel.

Felizmente, a formula de conversão de datas é muito simples. A seguinte função fará a conversão de uma data no Oracle para o padrão do Excel:

CREATE OR REPLACE FUNCTION convertOracleToSerialDate(p_date DATE) RETURN NUMBER
IS
BEGIN
RETURN (p_date – TO_DATE(’01-JAN-1900?))+2;
END;
/

Veja:

SQL*Plus: Release 10.2.0.4.0 – Production on Mon Nov 23 22:31:54 2009

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

Connected to:
Oracle Database 10g Express Edition Release 10.2.0.1.0 – Production

SQL> select convertOracleToSerialDate(’05-MAY-1968?) from dual;

CONVERTORACLETOSERIALDATE(’05-MAY-1968?)
—————————————-
24963

Se passarmos o valor “05-MAY-1968” para a função acima, teremos como resopsta 24963. Agora, se colocarmos esse valor numa planilha excel e mudar o tipo da celula para DATA, teremos esse número convertido para “05/05/1968”, ou qualquer outro formato que você escolher.

O reverso também é possível. Caso desejamos converter do formato excel para oracle, usamos essa simples função:

CREATE OR REPLACE FUNCTION convertSerialToOracleDate(p_serial_date NUMBER) RETURN DATE
IS
BEGIN
  RETURN (TO_DATE(’01-JAN-1900?) + p_serial_date)-2;
END;
/

Exemplo:

SQL*Plus: Release 10.2.0.4.0 – Production on Mon Nov 23 22:45:44 2009

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

Connected to:
Oracle Database 10g Express Edition Release 10.2.0.1.0 – Production

SQL> select convertSerialToOracleDate(24963) from dual;

CONVERTSE
———
05-MAY-68

SQL>

Agradecimentos a Jason Bennett pelas dicas acima.

Comments are closed.