none
SQL 2008 - Campos de Data RRS feed

  • Pergunta

  • Bom Dia Pessoal,

    Espero que alguém possa me ajudar rs.

    Estou migrando um banco de dados Firibird para o SQL 2008, porem a base do firibird não esta consistente então em alguns campos de data os dados estão por exemplo 01/01/0209 e quando vou importar por uma ferramenta de terceiro não passa porque segundo me passaram o SQL só permite data acima de 1753, porem não sei como resolver isso.

    E se tiver que arrumar isso na mão vai ser meio complicado porque são mais de 200 tabelas e quase todas tem campos de data.

    Se alguém souber como posso resolver isso, fico grato.

    Wellington Eduardo.

    sexta-feira, 13 de novembro de 2009 10:58

Respostas

  • Olá Wellington,

    Uma alternativa é usar o DATETIME2. Permite datas entre 01/01/0001 até 31/12/9999.

    Esse é um tipo de dados novo no SQL Server 2008.



    Abraço!!

    Classifiquem as respostas. O Fórum agradece!!
    • Sugerido como Resposta Alexandre VM sexta-feira, 13 de novembro de 2009 11:23
    • Editado Alexandre VM sexta-feira, 13 de novembro de 2009 11:25
    • Marcado como Resposta Wellington Eduardo sexta-feira, 13 de novembro de 2009 11:41
    sexta-feira, 13 de novembro de 2009 11:07
  • Opa,

    Usa esse select para gerar o script de alteração de todas tabelas que tenham DATETIME:

    SELECT 'ALTER TABLE ' + OBJECT_NAME (object_id) + ' ALTER COLUMN ' + name + ' DATETIME2 ' + CASE is_nullable WHEN 1 THEN 'NULL' ELSE 'NOT NULL' END
    FROM sys.columns c
    WHERE system_type_id = 61 -- id do datetime
    AND OBJECTPROPERTY (object_id, 'IsUserTable') = 1


    Depois só copia e executa o resultado.

    PS: Faz um backup antes ;), e principalmente, faz testes na aplicação com esse tipo de dados.



    Abraço



    Classifiquem as respostas. O Fórum agradece!!
    sexta-feira, 13 de novembro de 2009 11:22
  • É, vai ter que ser na mão mesmo.

    Uma sugestão é importar os dados no formato VARCHAR, e então fazer o seguinte select:

    SELECT SuaColuna
    FROM SuaTabela
    WHERE ISDATE (SuaColuna) = 0



    Ele vai mostrar os registros que estão incorretos.


    Além disso, se você quiser desfazer a alteração de antes, é só rodar o seguinte:


    SELECT 'ALTER TABLE ' + OBJECT_NAME (object_id) + ' ALTER COLUMN ' + name + ' DATETIME ' + CASE is_nullable WHEN 1 THEN 'NULL' ELSE 'NOT NULL' END
    FROM sys.columns c
    WHERE system_type_id = 42 -- id do datetime2
    AND OBJECTPROPERTY (object_id, 'IsUserTable') = 1


    Bom, só para registrar, o que apareceu na aplicação, quando usado com DATETIME2? Qual mensagem exatamente?

    Abraço!!


    Classifiquem as respostas. O Fórum agradece!!
    sexta-feira, 13 de novembro de 2009 13:23

Todas as Respostas

  • Olá Wellington,

    Uma alternativa é usar o DATETIME2. Permite datas entre 01/01/0001 até 31/12/9999.

    Esse é um tipo de dados novo no SQL Server 2008.



    Abraço!!

    Classifiquem as respostas. O Fórum agradece!!
    • Sugerido como Resposta Alexandre VM sexta-feira, 13 de novembro de 2009 11:23
    • Editado Alexandre VM sexta-feira, 13 de novembro de 2009 11:25
    • Marcado como Resposta Wellington Eduardo sexta-feira, 13 de novembro de 2009 11:41
    sexta-feira, 13 de novembro de 2009 11:07
  • Opa blza,

    Só uma pergunta eu vou ter que mudar campo por campo ou eu posso mudar alguma configuração ou rodar algum procedimento pra alterar o tipo dos campos?
    sexta-feira, 13 de novembro de 2009 11:13
  • Opa,

    Usa esse select para gerar o script de alteração de todas tabelas que tenham DATETIME:

    SELECT 'ALTER TABLE ' + OBJECT_NAME (object_id) + ' ALTER COLUMN ' + name + ' DATETIME2 ' + CASE is_nullable WHEN 1 THEN 'NULL' ELSE 'NOT NULL' END
    FROM sys.columns c
    WHERE system_type_id = 61 -- id do datetime
    AND OBJECTPROPERTY (object_id, 'IsUserTable') = 1


    Depois só copia e executa o resultado.

    PS: Faz um backup antes ;), e principalmente, faz testes na aplicação com esse tipo de dados.



    Abraço



    Classifiquem as respostas. O Fórum agradece!!
    sexta-feira, 13 de novembro de 2009 11:22
  • Opa, blza vou tentar aqui e te falo a resposta.

    Vlww
    sexta-feira, 13 de novembro de 2009 11:41
  • E cara, deu certoo que você ma passou..
    Só que a aplicação não e compativel mesmo com o DATETIME2...

    Agora zicou, o que da pra fazer e ir alterando na mão ne, pq no DATETIME ele vai tranquilo.
    sexta-feira, 13 de novembro de 2009 12:51
  • É, vai ter que ser na mão mesmo.

    Uma sugestão é importar os dados no formato VARCHAR, e então fazer o seguinte select:

    SELECT SuaColuna
    FROM SuaTabela
    WHERE ISDATE (SuaColuna) = 0



    Ele vai mostrar os registros que estão incorretos.


    Além disso, se você quiser desfazer a alteração de antes, é só rodar o seguinte:


    SELECT 'ALTER TABLE ' + OBJECT_NAME (object_id) + ' ALTER COLUMN ' + name + ' DATETIME ' + CASE is_nullable WHEN 1 THEN 'NULL' ELSE 'NOT NULL' END
    FROM sys.columns c
    WHERE system_type_id = 42 -- id do datetime2
    AND OBJECTPROPERTY (object_id, 'IsUserTable') = 1


    Bom, só para registrar, o que apareceu na aplicação, quando usado com DATETIME2? Qual mensagem exatamente?

    Abraço!!


    Classifiquem as respostas. O Fórum agradece!!
    sexta-feira, 13 de novembro de 2009 13:23
  • Vou tentar esse lance que você me passou, o erro que a aplicação retornou quando fui salvar foi:

    Error description: Error SQLRDD/1020 Tipo incorreto de dado: data type origin: 32 - data type target 1024

    sexta-feira, 13 de novembro de 2009 13:45
  • Wellington,

    Supostamente o tipo de dados que você esta tentando utilizar não esta sendo suportado.
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    sábado, 14 de novembro de 2009 22:05
    Moderador
  • Opa Junior,

    E isso mesmo a aplicação não da suporte a esse tipo de dados, em relação a importação do firebird deu tudo certo.
    Entrei em contato com o pessoal do erp e eles vão fazer os devidos testes e me passar uma nova versão com suporte a esse tipo de dados.

    Vou esperar o retorno deles, então por enquanto obrigado pela ajuda.
    domingo, 15 de novembro de 2009 14:25