Array
(
    [0] => stdClass Object
        (
            [Votos_Balanceados] => 1
            [id] => 539509
            [titulo] => Criação de trigger - diferença entre campos datetime com resultado p/ integer
            [dataCadastro] => DateTime Object
                (
                    [date] => 2015-12-09 19:28:37
                    [timezone_type] => 3
                    [timezone] => America/Sao_Paulo
                )

            [isFirstPost] => -1
            [idUsuario] => 378439
            [status] => A
            [isExample] => 
            [NomeUsuario] => Marcos P
            [Apelido] => 
            [Foto] => 378439_20140801115452.png
            [Conteudo] => 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 ? ) )

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

Fabricio Pereira
   - 09 dez 2015

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

Post mais votado

Marcos P
   - 09 dez 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 ?

Fabricio Pereira
   - 11 dez 2015

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.

Marcos P
   - 11 dez 2015

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 ?

#Código

UPDATE tabela SET Data_Fim = newDataFim, Total_Dif = DATEDIFF(mi, Data_Ini, newDataFim) WHERE...


Se você quiser manter isso na Trigger, faça :

#Código
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 ?!?

Fabricio Pereira
   - 11 dez 2015

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

Faabiianooc
   - 11 dez 2015


Citação:
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

Fabricio Pereira
   - 14 dez 2015

Obrigado FaabiianooC....vou testar

Fabricio Pereira
   - 21 dez 2015

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

ATT
Fabricio

Marcos P
   - 21 dez 2015

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" ) !