Criação de trigger - diferença entre campos datetime com resultado p/ integer
09/12/2015
0
Desde já agradeço
Fabricio Pereira
Post mais votado
09/12/2015
Valor absoluto ou pode ser valor negativo ( no caso de datafim ser menor que dataini ) ?
Você tem conhecimento para montar a query de update da coluna da diferença, fora do contexto da trigger ?
Você deseja atualizar isso via trigger no insert ou no update da linha ?
Marcos P
Mais Posts
11/12/2015
Fabricio Pereira
Valor absoluto ou pode ser valor negativo ( no caso de datafim ser menor que dataini ) ? - Nunca dataini vai ser anterior a datafim, dataini vai ser insert e na mesma linha (depois) vou dar update p/ atualizar datafim
Você tem conhecimento para montar a query de update da coluna da diferença, fora do contexto da trigger ? - Tabela vai ter um indice e Data ini ja vai estar la, fora isso não sei como fazer esse update, apenas o update da datafim
Você deseja atualizar isso via trigger no insert ou no update da linha ? - no update da linha, após ser atualizada a datafim rode a trigger que pegue a datafim que acabou de ser atualizada no registro, pegue a dataini e faça a subtração das 2 retornando a diferença em minutos e ataulizando a coluna totaldi do mesmo registro.
11/12/2015
Marcos P
Quanto a diferença em minutos, faça : DATEDIFF(mi, Data_Ini, Data_Fim). Isso vai lhe dar a diferença em minutos entre as duas datas.
Será que sempre Data_Ini será menor que Data_Fim ?
Repare que, em uma trigger, você simplesmente não tem condições de afirmar isso, pois updates vindos de fora da aplicação podem não garantir essa regra !
Já que você tem a query de update, porque não faz a atualização do Total_Dif na mesma query ?
UPDATE tabela SET Data_Fim = newDataFim, Total_Dif = DATEDIFF(mi, Data_Ini, newDataFim) WHERE...
Se você quiser manter isso na Trigger, faça :
CREATE TRIGGER trUpdate ON Tabela FOR UPDATE AS DECLARE @DataFim datetime -- Variavel simples que controla se a coluna foi atualizada DECLARE @Chave1 char(5) -- Exemplo de campo chave OBRIGATORIO a ser usado no WHERE do UPDATE DECLARE @Chave2 int -- Exemplo de outro campo chave OBRIGATORIO a ser usado no WHERE SET @Chave1 = (select Chave1 from inserted) -- Carrega os campos obrigatórios a serem usados no WHERE SET @Chave2 = (select Chave2 from inserted) -- evitando que outros registros sejam atualizados indevidamente SET @DataFim = (select Data_Fim from inserted) -- Será diferente de NULL se a coluna foi atualizada no update corrente IF (@DataFim is not null) -- Atualiza Total_Dif se Data_fim foi atualizada ( para o registro correto ) UPDATE tabela SET Data_Fim = newDataFim, Total_Dif = DATEDIFF(mi, Data_Ini, newDataFim) WHERE Chave1 = @Chave1 and Chave2 = @Chave2 GO
No código acima :
> Total_Dif será atualizado apenas no caso de atualização de Data_Fim. Se for necessário fazer a atualização também quando Data_Ini fora atualizada, adapte o código conforme sua necessidade.
> A ideia das "@Chaves" é que você precisa restringir o update de Total_Dif apenas ao registro corrente que está sendo atualizado. Para isso, carregue as colunas OBRIGATÓRIAS ( por exemplo : as colunas que compõem a PK da tabela ) em variáveis específicas, de modo a usá-las no WHERE.
> Atenção para updates recursivos, afinal você está fazendo um update na tabela dentro da trigger de update da própria tabela !
Ok ?!?
11/12/2015
Fabricio Pereira
Conforme verifiquei o comando DATEDIFF(mi, Data_Ini, Data_Fim) no update de datafim já é tudo que eu preciso, vou faze-lo na query de update da aplicação externa, Muitissimo obrigado....
Mais uma pergunta, esse comando DATEDIFF existe para outros bancos???? Oracle, Firebird, etc
11/12/2015
Fabiano Carvalho
Conforme verifiquei o comando DATEDIFF(mi, Data_Ini, Data_Fim) no update de datafim já é tudo que eu preciso, vou faze-lo na query de update da aplicação externa, Muitissimo obrigado....
Mais uma pergunta, esse comando DATEDIFF existe para outros bancos???? Oracle, Firebird, etc
Sim
21/12/2015
Fabricio Pereira
Gostaria de saber se essa trigger funciona no Firebird e como ela ficaria....
ATT
Fabricio
21/12/2015
Marcos P
Pesquise sobre os comandos equivalentes no Firebird e adapte a sintaxe acima, o conceito é exatamente o mesmo !
Mesmo caso do Oracle ( esse sim, um SGBDr "de verdade" ) !
Clique aqui para fazer login e interagir na Comunidade :)