Usuário com melhor resposta
Campo Calculado.

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..
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- Sugerido como Resposta Marcelo Fernandes da SilvaMVP segunda-feira, 31 de outubro de 2011 13:25
- Marcado como Resposta Fabrizzio CaputoModerator quinta-feira, 15 de dezembro de 2011 14:24
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- Sugerido como Resposta Marcelo Fernandes da SilvaMVP segunda-feira, 31 de outubro de 2011 13:25
- Marcado como Resposta Fabrizzio CaputoModerator quinta-feira, 15 de dezembro de 2011 14:24
-
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