Trabalhar com datas em banco de dados é popularmente uma tarefa meio chatinho e cheia de poréns.
Portanto quero compartilhar um caso onde tive que exportar uma tabela de um banco de dados Oracle e importar em outro.
A situação foi especial porque a única ferramenta disponível era a linha de comando SQL e como havia campos DATE, o formato da saída para um SELECT não era o mesmo aceito na hora de inserir no outro banco de dados Oracle, gerando erro na operação. Eu também não podia usar o export porque no outro banco já haviam dados e não podia perde-los.
Após algumas pesquisas encontrei uma solução relativamente simples para o caso, vamos à ela:
Para entender melhor sugiro criar esta tabela abaixo:
CREATE TABLE usuario ( "codigo" NUMBER NOT NULL ENABLE, "nome" VARCHAR2(100 BYTE), "ultimologin" DATE , CONSTRAINT "pk_usuario" PRIMARY KEY ("codigo"));
Insira estes dois registros na tabela de exemplo:
INSERT INTO usuario ("codigo", "nome", "ultimologin") VALUES (1,'gabriel', TO_DATE('22/09/1829 07:21', 'DD/MM/RR HH24:mi')); INSERT INTO usuario ("codigo", "nome", "ultimologin") VALUES (2,'tu', TO_DATE('21/07/1929 17:35', 'DD/MM/RR HH24:mi'));
Pronto, temos o ambiente para testar.
Agora vamos gerar um SQL Script de SELECT que irá gerar na saída um SQL Script de INSERT, note que isto não é segredo nenhum, a novidade é o uso do TO_CHAR para deixar a data no formato correto para inserção na outra tabela sem problemas. Veja como fica o Script para o exemplo dado:
SELECT 'INSERT INTO usuario ("codigo", "nome", "ultimologin") VALUES (' || "codigo" || ',''' || "nome" || '''' || ',TO_DATE(''' || TO_CHAR("ultimologin",'DD/MM/YYYY HH24:MI') ||''', ''DD/MM/RR HH24:mi''));' FROM usuario
A saída deste Script deve ser como esta a seguir, ou seja, um Script de INSERT prontinho para ser executado no outro Banco de Dados:
INSERT INTO usuario ("codigo", "nome", "ultimologin") VALUES (1,'gabriel',TO_DATE('22/09/1829 07:21', 'DD/MM/RR HH24:mi')); INSERT INTO usuario ("codigo", "nome", "ultimologin") VALUES (2,'tu',TO_DATE('21/07/1929 17:35', 'DD/MM/RR HH24:mi'));
É isso ai.