Criação de trigger - diferença entre campos datetime com resultado p/ integer

09/12/2015

1

Ola a todos....Tenho uma tabela com os campos dtaini/datafim(datetime) e totaldif(int), quero fazer uma trigger p/ ao atualizar datafim, atualize tambem a coluna totaldif com a diferença entre dataini e datafim...

Desde já agradeço
Responder

Post mais votado

09/12/2015

Você deseja a diferença em dias entra as duas data... é isso ?

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 ?
Responder

Mais Posts

Você deseja a diferença em dias entra as duas data... é isso ? - A diferença em minutos. Por ex.: dataini=10/12/2015 13:30:00 datafim=10/12/2015 14:10:00 totaldif=40

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.
Responder

11/12/2015

Marcos P

Vou lhe responder no contexto do Sql Server...

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 ?!?
Responder
CAro Marcos P boa tarde,
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
Responder
CAro Marcos P boa tarde,
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
Responder
Obrigado FaabiianooC....vou testar
Responder
Boa tarde caro Marcos P,
Gostaria de saber se essa trigger funciona no Firebird e como ela ficaria....

ATT
Fabricio
Responder

21/12/2015

Marcos P

Funciona, com certeza... embora, cada gerenciador de banco de dados tenha suas particularidades ( embora o Firebird seja bem "ruinzinho" em vários aspectos ).

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" ) !
Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira