none
Error converting data type varchar to datetime. RRS feed

  • Pergunta

  • Bom dia, tenho uma procedure que é executada pelo meu Vb.net afim de criar um relatório, porém...estou a obter o seguinte erro quando executo a procedure com seus respetivos parâmetros ERRO: "Error converting data type varchar to datetime."

    Segue a Procedure:

    CREATE OR ALTER PROCEDURE EsRl230

    @EMPCod NVARCHAR(MAX),
    @SGPId NVARCHAR(MAX),
    @MAPId NVARCHAR(MAX),
    @DtNaoVendido DATETIME,
    @DtCadastro DATETIME

    AS

    DECLARE

    @sql NVARCHAR(MAX)

    SET @DtNaoVendido =  CONVERT(VARCHAR(23), @DtNaoVendido, 101)
    SET @DtCadastro = CONVERT(VARCHAR(23), @DtCadastro, 101)

    SET @sql =
    'SELECT ' +
    'EMPSigla, ' +
    'GRPCod, ' +
    'GRPDesc, ' +
    'SGPCod, ' +
    'SGPDesc, ' +
    'MAPDesc, ' +
    'PROCod, ' +
    'PROCodFab, ' +
    'PRODesc = SUBSTRING(PRODesc,1,50), ' +
    'PROAplic = SUBSTRING(PROAplic,1,100), ' +
    'PREQtEst, ' +
    'PREPrVd, ' +
    'PRECstRp, ' +
    'COSDtFec, ' +
    'CNEDtLib ' +
    'FROM ' +
    'EsPRE (NoLock) ' +
          'JOIN GnEMP (NoLock) ON EsPRE.EMPCod = GnEMP.EMPCod ' +  
    'JOIN EsINE (NoLock) ON EsPRE.PREid = EsINE.PREid ' +
    'JOIN EsCNE (NoLock) ON EsINE.CNEId = EsCNE.CNEId ' +
          'JOIN EsPRO (NoLock) ON EsPRE.PROId = EsPRO.PROId ' +  
    'JOIN EsSGP (NoLock) ON EsPRO.SGPId = EsSGP.SGPId  ' +
    'JOIN EsGRP (NoLock) ON EsSGP.GRPId = EsGRP.GRPId ' +
    'LEFT JOIN EsMAP (NoLock) ON EsPRO.MAPId = EsMAP.MAPId ' +
    'JOIN SeCOS (NoLock) ON  SeCOS.EMPCod = GnEMP.EMPCod ' +
    'JOIN SeCRQ (NoLock) ON SeCOS.COSid = SeCRQ.COSid ' +
    'WHERE ' +
    'EsPRE.EMPCod IN (' + @EMPCod + ') ' 

    IF @SGPId IS NOT NULL
    BEGIN
    SET @sql = @sql + 'AND SGPId IN ' + @SGPId 
    END

    IF @MAPId IS NOT NULL
    BEGIN
    SET  @sql = @sql +  'AND MAPId IN (' + @MAPId + ') ' 
    END

    IF @DtNaoVendido IS NOT NULL
    BEGIN
    SET @sql = @sql + 'AND COSDtFec >= ' + @DtNaoVendido
    END

    IF @DtCadastro IS NOT NULL
    BEGIN
    SET @sql = @sql + ' AND CNEDtLib <= '  + @DtCadastro
    END

    EXEC (@sql )

    GO

    Quando executo passo os seguintes parâmetros por exemplo  : 

    execute EsRl230 '297', NULL, NULL, '02/04/2018' , '23/04/2018'

    por favor alguém me pode ajudar para ver onde estou errando para esse erro surgir?

    terça-feira, 24 de abril de 2018 13:14

Respostas

Todas as Respostas

  • Nelson,

    Como está fazendo a chamada da proc via código? Posso dar uma olhada no trecho?

    []'s

    terça-feira, 24 de abril de 2018 13:29
  • Nelson,

    Como está fazendo a chamada da proc via código? Posso dar uma olhada no trecho?

    []'s

    Public ReadOnly Property Dados As EsRl230_Ds
          Get

             Dim ds As New EsRl230_Ds

             Dim strSql As String =
                "EsRl230 " &
                SqlString(EMPCod, True) &
                SqlString(SGPId, True) &
                SqlString(MAPId, True) & "'" &
                Convert.ToDateTime(DtBoxProVenda) & "'" & "," & "'" &
                Convert.ToDateTime(DtBoxProCadastro) & "'"

             FillDataSetTable(strSql, ds, "Dados")

             Return ds

          End Get
       End Property


    End Class
    terça-feira, 24 de abril de 2018 13:36
  • Nelson,

    Como está fazendo a chamada da proc via código? Posso dar uma olhada no trecho?

    []'s

    Public ReadOnly Property Dados As EsRl230_Ds
          Get

             Dim ds As New EsRl230_Ds

             Dim strSql As String =
                "EsRl230 " &
                SqlString(EMPCod, True) &
                SqlString(SGPId, True) &
                SqlString(MAPId, True) & "'" &
                Convert.ToDateTime(DtBoxProVenda) & "'" & "," & "'" &
                Convert.ToDateTime(DtBoxProCadastro) & "'"

             FillDataSetTable(strSql, ds, "Dados")

             Return ds

          End Get
       End Property


    End Class

    Você já tentou atribuir essa mesma parametrização a uma chamada direta pelo seu banco? (com a data dd/MM/yyyy)

    Uma opção seria o cast da DtBoxProVenda e DtBoxProCadastro com hh:mm:ss, no formato padrão do SQL. Pelo meu entendimento, na sua conversão você está colocando a data entre aspas, então é um varchar... Tente algo como: Convert.ToDateTime(DtBoxProVenda).ToString("MM/dd/yyyy HH:mm:ss") (veja o formato correto que você precisa)

    Outra alternativa: Altere o parâmetro de DtNaoVendido e DtCadastro para receber varchar, e faça o cast dentro da proc...

    []'s


    • Editado adeilsoncs terça-feira, 24 de abril de 2018 13:49
    terça-feira, 24 de abril de 2018 13:48
  • Nelson,

    Como está fazendo a chamada da proc via código? Posso dar uma olhada no trecho?

    []'s

    Public ReadOnly Property Dados As EsRl230_Ds
          Get

             Dim ds As New EsRl230_Ds

             Dim strSql As String =
                "EsRl230 " &
                SqlString(EMPCod, True) &
                SqlString(SGPId, True) &
                SqlString(MAPId, True) & "'" &
                Convert.ToDateTime(DtBoxProVenda) & "'" & "," & "'" &
                Convert.ToDateTime(DtBoxProCadastro) & "'"

             FillDataSetTable(strSql, ds, "Dados")

             Return ds

          End Get
       End Property


    End Class

    Você já tentou atribuir essa mesma parametrização a uma chamada direta pelo seu banco? (com a data dd/MM/yyyy)

    Uma opção seria o cast da DtBoxProVenda e DtBoxProCadastro com hh:mm:ss, no formato padrão do SQL. Pelo meu entendimento, na sua conversão você está colocando a data entre aspas, então é um varchar... Tente algo como: Convert.ToDateTime(DtBoxProVenda).ToString("MM/dd/yyyy HH:mm:ss") (veja o formato correto que você precisa)

    Outra alternativa: Altere o parâmetro de DtNaoVendido e DtCadastro para receber varchar, e faça o cast dentro da proc...

    []'s


    Pode me dar um exemplo do CAST?
    terça-feira, 24 de abril de 2018 14:11
  • Ola,

    tente executar a procedure assim:

    execute EsRl230 '297', NULL, NULL, '2018-04-02' , '2018-04-23'

    Abs


    Vinicius Fonseca - MCP | MCTS | MCDBA | MCITP | MCTS | MCT | ITIL Foundation - DGA SISTEMAS - Se minha resposta for útil, classifique-a. :)

    terça-feira, 24 de abril de 2018 14:14
  • Estou revendo sua procedure aqui, e dentro dela você já faz um CONVERT da data para o formato VARCHAR,

    Trecho:

    SET @DtNaoVendido =  CONVERT(VARCHAR(23), @DtNaoVendido, 101)
    SET @DtCadastro = CONVERT(VARCHAR(23), @DtCadastro, 101)


    Neste caso, tente alterar o formato de entrada da procedure para:

    @DtNaoVendido  NVARCHAR(MAX),
    @DtCadastro    NVARCHAR(MAX)

    Assim você pode fazer a conversão no formato 101 (mm/dd/yyyy) direto no seu código, e eliminaria a conversão dentro da proc.

    terça-feira, 24 de abril de 2018 14:26
  • Deleted
    terça-feira, 24 de abril de 2018 17:35
  • Estou revendo sua procedure aqui, e dentro dela você já faz um CONVERT da data para o formato VARCHAR,

    Trecho:

    SET @DtNaoVendido =  CONVERT(VARCHAR(23), @DtNaoVendido, 101)
    SET @DtCadastro = CONVERT(VARCHAR(23), @DtCadastro, 101)


    Neste caso, tente alterar o formato de entrada da procedure para:

    @DtNaoVendido  NVARCHAR(MAX),
    @DtCadastro    NVARCHAR(MAX)

    Assim você pode fazer a conversão no formato 101 (mm/dd/yyyy) direto no seu código, e eliminaria a conversão dentro da proc.

    O erro que surge agora é 

    Msg 102, Level 15, State 1, Line 84
    Incorrect syntax near '00'.

    A String está saindo AND COSDtFec >= 2018-04-02 00:00:00.00 AND CNEDtLib <= 2018-04-24 23:59:59.00

    esse .00 sabe como tirar?

    sexta-feira, 27 de abril de 2018 19:07
  • Deleted
    sexta-feira, 27 de abril de 2018 19:33
  • Uma das causas do erro "Error converting data type varchar to datetime." é informar a data em um formato mas a sessão estar configurada para tratar as conversões implícitas em outro formato. Por exemplo, receber a data no formato dd/mm/aaaa mas a sessão está configurada para conversões implícitas utilizando o formato mm/dd/aaaa. Neste caso, para o valor '23/04/2018' ocorre erro, pois não existe mês 23.

    Outra possibilidade é no caso de conversão explícita mas com o estilo definido diferente do valor recebido. Por exemplo,
        convert(date, '23/04/2018', 101)
    Neste caso, o estilo definido, 101, requer que a data seja informada no formato mm/dd/aaaa...

    Para mim o trecho
         SET @DtNaoVendido =  CONVERT(VARCHAR(23), @DtNaoVendido, 101)
         SET @DtCadastro = CONVERT(VARCHAR(23), @DtCadastro, 101)
    não faz sentido e é provável que o erro esteja nessas instruções. Observe que como as duas variáveis (na realidade são parâmetros de entrada!) estão declaradas como datetime, ocorre uma conversão implícita de varchar(23) para datetime antes do armazenamento. O estilo 101 faz com que seja gerado string no formato mm/dd/aaaa; após, a conversão implícita transforma o string em tipo de dados datetime utilizando o dateformat corrente. 
      

    (1)
    Qual é o número da linha indicada como local do erro? Se for 1, provavelmente é algo na passagem ou declaração dos parâmetros.

    (2)
    Para fins de testes, no lugar de
       EXEC (@sql )
    coloque
      PRINT @sql

    e analise o texto gerado para o comando T-SQL.

    (3)
    Sugiro que substitua o trecho
         IF @SGPId IS NOT NULL
         BEGIN
         SET @sql = @sql + 'AND SGPId IN ' + @SGPId
         END
    por
         IF @SGPId IS NOT NULL
         BEGIN
         SET @sql = @sql + 'AND SGPId IN (' + @SGPId + ') '
         END

    (4)
    Como estão declaradas as colunas COSDtFec e CNEDtLib?

    -----

    Enquanto as respostas não vêm, eis sugestão de modificação no código:

    -- código #1
    ...
    
    declare @sql nvarchar(max);
    declare @xDtNaoVendido char(10), @xDtCadastro char(10);
    
    set @xDtNaoVendido=  convert(char(10), @DtNaoVendido, 103);
    set @xDtCadastro= convert(char(10), @DtCadastro, 103);
    
    ...

    e

    -- código #2
    ...
    
    IF @xDtNaoVendido IS NOT NULL
      set @sql = @sql + 'AND COSDtFec >= convert(date, ''' + @xDtNaoVendido + ''', 103) ';
    
    IF @xDtCadastro IS NOT NULL
      SET @sql = @sql + 'AND CNEDtLib <= convert(date, ''' + @xDtCadastro + ''', 103) ';
    
    ...


    e-mail       José Diz     Belo Horizonte, MG - Brasil


    Deu certo, obrigado
    segunda-feira, 30 de abril de 2018 13:07
  • Deleted
    segunda-feira, 30 de abril de 2018 16:58