none
Campo Calculado. RRS feed

  • Pergunta

  • Bom dia,

      Poderiam me ajudar em um problema? eu tenho uma tabela com 3 campos, no qual existem 2 campos do tipo datetime, chamados de dataHoraInicial e dataHoraFinal, e um campo chamado diferença do tipo int tudo bem? O que eu preciso é calcular a diferença em minutos o script eu ja achei que seria esse no caso SELECT ISNULL(DATEDIFF(Mi,EVDT_INICIO,EVDT_FIM),0) as diferenca FROM PR_EVENTO  o que eu gostaria de saber onde eu insiro este script para que o campo calcule automaticamente no momento em que eu inserir os dados no campo dataHoraInicial e dataHoraFinal, Obrigado..

     

     

     

     

     


    segunda-feira, 31 de outubro de 2011 11:37

Respostas

  • Eduardo,

     

    Segue um exemplo:

    CREATE TABLE Teste

    (

    DataInicial DATETIME,

    DataFInal DATETIME,

    Diferenca INT

    )

     

    INSERT INTO Teste VALUES

    (GETDATE(), DATEADD(MINUTE, 5, GETDATE()), null),

    (GETDATE(), DATEADD(MINUTE, 5, GETDATE()), null),

    (GETDATE(), DATEADD(MINUTE, 5, GETDATE()), null),

    (GETDATE(), DATEADD(MINUTE, 5, GETDATE()), null)

     

    CREATE TABLE Teste2

    (

    DataInicial DATETIME,

    DataFInal DATETIME,

    DiferencaMin AS (DATEDIFF(MINUTE, DataInicial, DataFinal)) PERSISTED

    )

     

    INSERT INTO Teste2 (DataInicial, DataFinal)

    SELECT DataInicial, DataFInal FROM Teste

     

    SELECT * FROM TEste2


    Fabrizzio A. Caputo
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com
    segunda-feira, 31 de outubro de 2011 12:27
    Moderador

Todas as Respostas

  • Eduardo,

     

    Segue um exemplo:

    CREATE TABLE Teste

    (

    DataInicial DATETIME,

    DataFInal DATETIME,

    Diferenca INT

    )

     

    INSERT INTO Teste VALUES

    (GETDATE(), DATEADD(MINUTE, 5, GETDATE()), null),

    (GETDATE(), DATEADD(MINUTE, 5, GETDATE()), null),

    (GETDATE(), DATEADD(MINUTE, 5, GETDATE()), null),

    (GETDATE(), DATEADD(MINUTE, 5, GETDATE()), null)

     

    CREATE TABLE Teste2

    (

    DataInicial DATETIME,

    DataFInal DATETIME,

    DiferencaMin AS (DATEDIFF(MINUTE, DataInicial, DataFinal)) PERSISTED

    )

     

    INSERT INTO Teste2 (DataInicial, DataFinal)

    SELECT DataInicial, DataFInal FROM Teste

     

    SELECT * FROM TEste2


    Fabrizzio A. Caputo
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com
    segunda-feira, 31 de outubro de 2011 12:27
    Moderador
  • Eduardo existe algo no sql server chamado coluna calculada. O que é isso? Bem, você pode criar uma coluna que seja fruto de operações de várias colunas da mesma tabela. O legal é que ela não ocupa espaço no banco de dados. O sql server ele faz a conta toda a vezes que você fizer um pesquisa que dependa da coluna.

    Vamos ao exemplo.

    Em uma tabela venda eu possuo os Campos Subtotal, Desconto e Acrescimo. Ao invés de eu criar um campo chamado Total que equivale ao Subtotal - Desconto + Acrescimo e persistir esse dado no banco além de calcular ele na minha aplicação eu posso criar uma coluna calculada.

    Alter Table Tabela Add Total As (SubTotal + Acrescimo - Desconto). Agora o barato é que essa coluna não ocupa espaço no banco. Toda vez que você chamar a coluna o sql server fará  a operação em questão. 

    Agora caso você não deseja que o sql server tenha que ficar fazendo operação (você quer que o sql server calcule o dado e depois persista o calculo no banco para que ele não precise fazer nenhuma operação na hora de ler o dado, você pode criar a coluna da seguinte maneira.

    Alter Table Tabela Add Total As (SubTotal + Acrescimo - Desconto) PERSISTED

    Bem eu recomendo utilizar sem o persisted, pois eu tenho bastante coluna calculada, uso bastante elas e baseado na minha experiência (cenário inferior a 10 maquinas e servidor quando muito um i3) e no meu desconhecimento completo de performance acho que o custo adicional de cpu é bem melhor do que o custo de I.O de possuir uma coluna a mais. Agora isso desde que você não utilize essa coluna como criterio de busca.


    Concatenado
    sexta-feira, 4 de novembro de 2011 11:05