09/12/2015

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

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

Fabricio Pereira

Melhor resposta

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 ?

Marcos P

Responder Citar

Outras Respostas

11/12/2015

Fabricio Pereira

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 Citar

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 Citar

11/12/2015

Fabricio Pereira

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 Citar

11/12/2015

Fabiano Carvalho

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 Citar

14/12/2015

Fabricio Pereira

Obrigado FaabiianooC....vou testar
Responder Citar

21/12/2015

Fabricio Pereira

Boa tarde caro Marcos P,
Gostaria de saber se essa trigger funciona no Firebird e como ela ficaria....

ATT
Fabricio
Responder Citar

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 Citar