none
Update em campo de data que atualiza campo calculado RRS feed

  • Pergunta

  • Eu tenho na minha tabela um campo de DtComportamento do tipo DateTime. Além deste tenho outros três campos computados da seguinte forma:

    DIA: (datepart(day,getdate()))

    MES: (datepart(month,getdate()))

    ANO: (datepart(year,getdate()))

    Com base nesta situação eu tenho um problema e uma dúvida:


    Dúvida: Como faço para computar os campos com base no DtComportamento? Ou seja, preciso de algo como:

    DIA: (datepart(day,DtComportamento))

    MES: (datepart(month,DtComportamento))

    ANO: (datepart(year,DtComportamento))


    Problema: Ao fazer um Update na tabela, o SQL me retorna:

    "A conversão de um tipo de dados varchar em um tipo de dados datetime resultou em um valor fora do intervalo."

    Este é o meu Update:

    UPDATE Comportamentos SET IdAvaliado = 1013, 
                              IdArea = 3, 
                              Nome = 'Auxilia quando solicitado', 
                              Tipo = 1, 
                              Descricao = 'Auxilia os colegas quando solicitado',
                              Nota = 9.5, 
                              DtComportamento = '2015-07-31 16:12' 
    WHERE Id = 13

    quarta-feira, 5 de agosto de 2015 12:55

Respostas

  • Com a ajuda dos colegas do Stack Overflow descobrimos o problema:

    O seu problema não é nos campos calculados, mas com o formato da Data e a Linguagem do seu banco de dados.

    No exemplo da pergunta, o Update no campo DTComportamentos é:

    DtComportamento = '2015-07-31 16:12' 
    Porém, no seu comentário, a linguagem do seu banco está Português. Para você fazer o seu update (ou Insert), troque para:

    DtComportamento = '2015-31-07 16:12' 
    O comando para saber a linguagem do banco é:

    select name from sys.syslanguages where langid=@@langid
    O comando para alterar a linguagem (apenas na sessão corrente) é:

    SET LANGUAGE portuguese
    Atualização:

    Para criar campos calcualdos que extraem Dia,Mes e Ano de um campo do tipo DateTime, você pode fazer de duas formas:

    Utlizando a função datepart:

     Dia AS (datepart(day,DtComportamento)),
     Mes AS (datepart(month,DtComportamento)),
     Ano AS (datepart(year,DtComportamento)),
    Ou como o @LucioRubens disse em seu comentário, utilizando as funções DAY,MONTH e YEAR diretamente:

     Dia AS (DAY(DtComportamento)),
     Mes AS (MONTH(DtComportamento)),
     Ano AS (YEARDtComportamento)),

    Pergunta no Stack Overflow

    • Marcado como Resposta Isabela Ribeiro quarta-feira, 5 de agosto de 2015 15:01
    quarta-feira, 5 de agosto de 2015 15:01

Todas as Respostas

  • Bom dia,

    Sobre a dúvida, acredito que você conseguira obter o resultado desejado utilizando essa formula que você postou.

    Sobre o problema, deve estar ocorrendo por causa do formato da data. Não sei como você está executando esse Update mas uma alternativa seria utilizar o formato abaixo:

    DtComportamento = '20150731 16:12' 

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 5 de agosto de 2015 13:08
  • O recurso da data sem os "tracinhos" funcionou muito bem, você sabe como faço para o campo calculado ser atualizado com base no campo de data da tabela?

    Ex.: Se o campo DtComportamento está com o valor: 2015-07-31 16:12:00.000, logo o campo dia deverá ter como valor 31, o mês como 07 e o ano como 2015. Da forma como esta hoje, ele pega sempre a data de cadastro...

    Este é meu código de criação da tabela:

    CREATE TABLE dbo.Comportamentos (
      Id int NOT NULL IDENTITY(1, 1),
      IdAvaliador int NOT NULL REFERENCES dbo.Colaboradores(Id),
      IdAvaliado int NOT NULL REFERENCES dbo.Colaboradores(Id),
      IdArea int NOT NULL REFERENCES dbo.Areas_Comportamento(Id),
      Nome varchar (100) NOT NULL,
      Tipo smallint NOT NULL,
      Descricao varchar (300) NULL,
      Nota decimal (5, 2) NULL,
      Dia AS (datepart(day,getdate())),
      Mes AS (datepart(month,getdate())),
      Ano AS (datepart(year,getdate())),
      DtComportamento datetime NULL DEFAULT GETDATE(),
      DtCadastro datetime NOT NULL DEFAULT GETDATE(),
      Status smallint NOT NULL DEFAULT 1
    ) 

    quarta-feira, 5 de agosto de 2015 13:26
  • Experimente dessa forma:

    CREATE TABLE dbo.Comportamentos (
      Id int NOT NULL IDENTITY(1, 1),
      IdAvaliador int NOT NULL REFERENCES dbo.Colaboradores(Id),
      IdAvaliado int NOT NULL REFERENCES dbo.Colaboradores(Id),
      IdArea int NOT NULL REFERENCES dbo.Areas_Comportamento(Id),
      Nome varchar (100) NOT NULL,
      Tipo smallint NOT NULL,
      Descricao varchar (300) NULL,
      Nota decimal (5, 2) NULL,
      Dia AS (datepart(day,DtComportamento)),
      Mes AS (datepart(month,DtComportamento)),
      Ano AS (datepart(year,DtComportamento)),
      DtComportamento datetime NULL DEFAULT GETDATE(),
      DtCadastro datetime NOT NULL DEFAULT GETDATE(),
      Status smallint NOT NULL DEFAULT 1
    ) 

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 5 de agosto de 2015 13:52
  • Com a ajuda dos colegas do Stack Overflow descobrimos o problema:

    O seu problema não é nos campos calculados, mas com o formato da Data e a Linguagem do seu banco de dados.

    No exemplo da pergunta, o Update no campo DTComportamentos é:

    DtComportamento = '2015-07-31 16:12' 
    Porém, no seu comentário, a linguagem do seu banco está Português. Para você fazer o seu update (ou Insert), troque para:

    DtComportamento = '2015-31-07 16:12' 
    O comando para saber a linguagem do banco é:

    select name from sys.syslanguages where langid=@@langid
    O comando para alterar a linguagem (apenas na sessão corrente) é:

    SET LANGUAGE portuguese
    Atualização:

    Para criar campos calcualdos que extraem Dia,Mes e Ano de um campo do tipo DateTime, você pode fazer de duas formas:

    Utlizando a função datepart:

     Dia AS (datepart(day,DtComportamento)),
     Mes AS (datepart(month,DtComportamento)),
     Ano AS (datepart(year,DtComportamento)),
    Ou como o @LucioRubens disse em seu comentário, utilizando as funções DAY,MONTH e YEAR diretamente:

     Dia AS (DAY(DtComportamento)),
     Mes AS (MONTH(DtComportamento)),
     Ano AS (YEARDtComportamento)),

    Pergunta no Stack Overflow

    • Marcado como Resposta Isabela Ribeiro quarta-feira, 5 de agosto de 2015 15:01
    quarta-feira, 5 de agosto de 2015 15:01