none
Problema com campo DATE RRS feed

  • Pergunta

  • Estou fazendo um cursor para percorrer uma tabela A, capturar algumas informações e inseri-las em uma tabela B.

    Os campos estão no formato DATE e instrução é essa:

    insert into Vigencia (DataInicio, DataFinal, IdPlataforma, IdMarca, IdProduto)
    values ('01/04/2011', '30/09/11', @idPlataforma, @idMarca, @idProduto)

    dou f5 e o sql retorna este erro:

    Msg 241, Level 16, State 1, Line 13
    Conversion failed when converting date and/or time from character string.

    Já tentei tirar as aspas, colocar aspas duplas, colocar aspas simpels e duplas e nada resolve.

    Qual é o formato correto pra inserir uma data em um campo setado como DATE no sql server?

    Obrigado.

    terça-feira, 13 de março de 2012 17:56

Respostas

  • João, boa tarde.

    Vc pode informar ao SQL o formato de data que vc está trabalhar através do comando SET DATEFORMAT

    Coloque da seguinte forma: set dateformart dmy

    Desta forma o SQL irá interpretar toda a manipulação de data como dia/mês/Ano.

    Mudando agora de assunto: pq vc está utilizando cursores? Pergunto pois cursores não são perfomáticos. Em um volume considerável de dados a sua rotina poderia se tornar inviável em relação a perfomance. Tente inserir os dados da tabela A diretamente na tabela B, utilizando um critério que satisfaça a condição desejada.

    Abs.


    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp

    • Marcado como Resposta Heloisa Pires sexta-feira, 23 de março de 2012 16:53
    terça-feira, 13 de março de 2012 18:29
  • João

    Eu sempre defino o formato de data na aplicação como AAAA-MM-DD

    • Marcado como Resposta Heloisa Pires sexta-feira, 23 de março de 2012 16:53
    terça-feira, 13 de março de 2012 18:36
  • Boa Noite,

    Eu não recomendo nem o formato americano e nem o SET DATEFORMAT. O formato americano pode dar problemas se o Default Language do usuário for alterado e aí sua aplicação ficará dependente dessa configuração. O SET DATEFORMAT pode provocar recompilações se colocado dentro de uma SP (quando não outros problemas).

    O ideal é utilizar o formato chinês YYYYMMDD sem hífens e você nunca terá problemas.

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos:http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível

    • Sugerido como Resposta Gustavo Maia Aguiar terça-feira, 13 de março de 2012 22:15
    • Marcado como Resposta Heloisa Pires sexta-feira, 23 de março de 2012 16:53
    terça-feira, 13 de março de 2012 22:15
  • Olá João Goya,

    Tente executar o comando da seguinte forma:

    insert into Vigencia (DataInicio, DataFinal, IdPlataforma, IdMarca, IdProduto)
    values ('20110401', '20110930', @idPlataforma, @idMarca, @idProduto)



    Heloisa Pires | LATAM Forum Support Engineer | Microsoft Corporation

    • Marcado como Resposta Heloisa Pires sexta-feira, 23 de março de 2012 16:53
    quarta-feira, 21 de março de 2012 16:38

Todas as Respostas

  • Olá Joao,

    Você pode tentar inserir no formato americano mes/dia/ano.

    abraços.

    Se útil, Classifique.


    Dhiego Piroto - MCP | MCTS SQL Server 2008 Developer | Email: dhiegopiroto@gmail.com é de SP e Vai ao SQL Saturday #127?

    terça-feira, 13 de março de 2012 17:58
  • João, boa tarde.

    Vc pode informar ao SQL o formato de data que vc está trabalhar através do comando SET DATEFORMAT

    Coloque da seguinte forma: set dateformart dmy

    Desta forma o SQL irá interpretar toda a manipulação de data como dia/mês/Ano.

    Mudando agora de assunto: pq vc está utilizando cursores? Pergunto pois cursores não são perfomáticos. Em um volume considerável de dados a sua rotina poderia se tornar inviável em relação a perfomance. Tente inserir os dados da tabela A diretamente na tabela B, utilizando um critério que satisfaça a condição desejada.

    Abs.


    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp

    • Marcado como Resposta Heloisa Pires sexta-feira, 23 de março de 2012 16:53
    terça-feira, 13 de março de 2012 18:29
  • João

    Eu sempre defino o formato de data na aplicação como AAAA-MM-DD

    • Marcado como Resposta Heloisa Pires sexta-feira, 23 de março de 2012 16:53
    terça-feira, 13 de março de 2012 18:36
  • Boa Noite,

    Eu não recomendo nem o formato americano e nem o SET DATEFORMAT. O formato americano pode dar problemas se o Default Language do usuário for alterado e aí sua aplicação ficará dependente dessa configuração. O SET DATEFORMAT pode provocar recompilações se colocado dentro de uma SP (quando não outros problemas).

    O ideal é utilizar o formato chinês YYYYMMDD sem hífens e você nunca terá problemas.

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos:http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível

    • Sugerido como Resposta Gustavo Maia Aguiar terça-feira, 13 de março de 2012 22:15
    • Marcado como Resposta Heloisa Pires sexta-feira, 23 de março de 2012 16:53
    terça-feira, 13 de março de 2012 22:15
  • Gustavo

    O padrão YYYY-MM-DD é internacional definido pela ISO 8601. Não posso afirma que o padrão YYYYMMDD que voce informou poderá apresentar problemas mas eu posso afirmar que o padrão YYYY-MM-DD não irá.

    Para maiores esclarecimentos

    http://pt.wikipedia.org/wiki/ISO_8601

    quinta-feira, 15 de março de 2012 17:55
  • Olá João Goya,

    Tente executar o comando da seguinte forma:

    insert into Vigencia (DataInicio, DataFinal, IdPlataforma, IdMarca, IdProduto)
    values ('20110401', '20110930', @idPlataforma, @idMarca, @idProduto)



    Heloisa Pires | LATAM Forum Support Engineer | Microsoft Corporation

    • Marcado como Resposta Heloisa Pires sexta-feira, 23 de março de 2012 16:53
    quarta-feira, 21 de março de 2012 16:38
  • Boa Tarde,

    Eu conheço essas especificação. Entretanto, não há problemas em usar com ou sem hífens. Abaixo disponibilizo um script

    -- Muda o formato de data no formato YMD (Ano-Dia-Mes)
    SET DATEFORMAT DMY

    -- Declara duas variáveis do tipo DATE
    DECLARE @D1 DATE, @D2 DATE, @D3 DATE
    SELECT @D1 = '2012-03-21', @D2 = '20120321'

    -- Extrai o mês
    SELECT
     DAY(@D1), MONTH(@D1), YEAR(@D1),
     DAY(@D2), MONTH(@D2), YEAR(@D2)

    Qualquer combinação de SET DATEFORMAT dará os mesmos e corretos resultados. Não encontrei um problema em utilizar os não o hífen, mas normalmente eu não utilizo hífens e até onde vejo, os melhores especialistas em T-SQL também não (vide Itzik Ben Gan).

    Ainda assim, entendo que é uma questão de escolha. Você já encontrou problemas com o YYYYMMDD (sem hífens) ?

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos:http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível



    quarta-feira, 21 de março de 2012 17:58