Resultados 1 a 9 de 9
  1. #1
    Membro cronusmaker's Avatar
    Data de Ingresso
    May 2015
    Posts
    473
    Thanks Thanks Given 
    5
    Thanks Thanks Received 
    11
    Thanked in
    9 Posts
    Mencionado
    13 Post(s)
    MEU HUMOR
    Buzzed
    País
    Brazil

    Contagem de tempo online de conta + char (HOT)

    Atenção
    funciona melhor em sql 2008+



    Há tempos vejo pessoas pedindo query pra contar tempo online de char, então resolvi por a mão na massa e fazer uma.


    Se houver bugs eu fixo, só avisar aqui, mas aparentemente está 100% (fiz inúmeros testes).[B]


    A contagem é feita em segundos e é armazenada:


    - Tempo da conta: na MEMB_INFO, coluna TimeON.
    - Tempo de cada char: na Character, coluna TimeON.




    O tempo online é atualizado:


    - Quando você seleciona char (mesmo se não trocar de char).
    - Quando você troca de char.
    - Quando você desloga a conta.


    Vamos lá.




    [B]♦ Versões atuais dos Scripts:


    - TRIGGER: 2.1.2
    - WZ_DISCONNECT_MEMB: 2.0.0




    [B]♦ ALTER TABLES
    Código PHP:
    USE [MUOnline]GO
    ALTER TABLE 
    [dbo].[MEMB_STAT]ALTER COLUMN [ConnectTM] [datetimeNULLGO
    ALTER TABLE 
    [dbo].[MEMB_STAT]ALTER COLUMN [DisConnectTM] [datetimeNULLGO
    ALTER TABLE 
    [dbo].[MEMB_INFO]ADD    [TimeON] [bigintNOT NULL DEFAULT 0GO
    ALTER TABLE 
    [dbo].[Character]ADD    [ConnectTM] [datetimeNULLGO
    ALTER TABLE 
    [dbo].[Character]ADD    [DisConnectTM] [datetimeNULLGO
    ALTER TABLE  
    [dbo].[Character]ADD    [TimeON] [bigint] DEFAULT ((0)) NOT NULLGO 

    ♦ TRIGGER - AccountCharacter_Online


    Código PHP:
    /*| @author - Renato Valer| @version - 2.1.2| @last update - 2016/02/12 - 08h18min| @warning: Não me responsabilizo por uso incorreto e possíveis deadlocks. Use por sua conta e risco.*/
    USE MuOnlineGO
    IF EXISTS (SELECT name FROM sysobjects WHERE name 'AccountCharacter_Online' AND type 'TR')    DROP TRIGGER [AccountCharacter_Online]GO
    CREATE TRIGGER 
    [AccountCharacter_OnlineON [dbo].[AccountCharacterAFTER UPDATE AS    SET NOCOUNT ON
    /*|    Hipóteses|    ||        1 - Se GameIDC foi atualizado, algum char foi foi logado. Surgem hipóteses:||            1.1 - GameIDC e Old_GameIDC são diferentes:|    |                1.1.1 - Old_GameIDC é NULL, logo é o primeiro char logado (e possivelmente o primeiro criado) na conta, |                    pois não existe GameIDC anterior.|                1.1.2 - Já existe um GameIDC anterior, logo significa que o cara acessou outro char. Surgem 2 hipóteses:||                    1.1.2.1 - O cara simplesmente trocou de char sem deslogar a conta:|                        1.1.2.1.1 - O cara logou um char, deletou ele e entrou em outro.|                    1.1.2.2 - O cara relogou a conta e entrou em outro char.|                        1.1.2.2.1 - O cara logou um char, deletou ele, saiu da conta, voltou e entrou em outro.|                        |            1.2 GameIDC e Old_GameIDC são iguais:|                        |                1.2.1 - O cara relogou o char.|                1.2.2 - O cara relogou a conta e entrou no mesmo char.||        2. Se GameIDC não foi atualizado, não precisa fazer nada, porque significa:|        |            2.1 - Que um char foi criado, mas não foi logado.|            2.2 - Que um char foi deletado sem nem mesmo ter sido logado.|                |        */
    -- Hipótese 1IF UPDATE(GameIDCBEGIN
        
    DECLARE @Login VARCHAR(10),    @GameIDC VARCHAR(10),    @Old_GameIDC VARCHAR(10),    @GameIDC_ConnectTM DATETIME,    @GameIDC_ConnectTM_Int INT,    @Old_GameIDC_ConnectTM DATETIME,    @Old_GameIDC_ConnectTM_Int INT,    @GameIDC_DisConnectTM DATETIME,    @GameIDC_DisConnectTM_Int INT,    @Old_GameIDC_DisConnectTM DATETIME,    @Old_GameIDC_DisConnectTM_Int INT,    @account_DisconnectTM DATETIME,    @account_DisconnectTM_Int INT,    @Now DATETIME,    @Now_Int INT,    @TimeON BIGINT;
        
    SET @Login = (SELECT Id FROM INSERTED);    SET @GameIDC = (SELECT GameIDC FROM AccountCharacter WHERE Id = @Login);    SET @Old_GameIDC = (SELECT GameIDC FROM DELETED);    SET @Now GETDATE();    SET @Now_Int DATEDIFF(s'19700101', @Now);    SET @account_DisconnectTM = (SELECT DisconnectTM FROM MEMB_STAT WHERE memb___id = @Login);    SET @account_DisconnectTM_Int DATEDIFF(s'19700101', @account_DisconnectTM);
        -- 
    Hipótese 1.1    IF(@GameIDC <> @Old_GameIDCBEGIN
            
    -- Hipótese 1.1.1        IF(@Old_GameIDC IS NULLBEGIN                        UPDATE Character SET ConnectTM = @Now WHERE AccountID = @Login AND Name = @GameIDC;                    END        -- Hipótese 1.1.2        ELSE BEGIN                    SET @Old_GameIDC_DisconnectTM = @Now            SET @Old_GameIDC_DisconnectTM_Int = @Now_Int;                        -- Hipótese 1.1.2.1            IF @account_DisconnectTM_Int <> @Old_GameIDC_DisconnectTM_IntBEGIN                            -- Verificação da Hipótese 1.1.2.1.1                IF EXISTS(SELECT Name FROM Character WHERE AccountID = @Login AND Name = @Old_GameIDCBEGIN
                        SET 
    @Old_GameIDC_ConnectTM = (SELECT ConnectTM FROM Character WHERE AccountID = @Login AND Name = @Old_GameIDC);                    SET @Old_GameIDC_ConnectTM_Int DATEDIFF(s'19700101', @Old_GameIDC_ConnectTM);                                SET @TimeON = @Old_GameIDC_DisconnectTM_Int - @Old_GameIDC_ConnectTM_Int;                                    UPDATE Character SET TimeON TimeON + @TimeONDisConnectTM = @Now WHERE AccountID = @Login AND Name = @Old_GameIDC;                                                    END                            END            -- Hipótese 1.1.2.2 e "fim" da Hipótese 1.1.2.1            -- A query é a mesma e um "else" é desnecessário.                    /*            |    Não é necessário atualizar tempo on, porque se o cara relogou a conta            |    a WZ_DISCONNECT_MEMB já fez o serviço. Só precisamos atualizar o momento            |    de connect do novo char.            */            UPDATE Character SET ConnectTM = @Now WHERE AccountID = @Login AND Name = @GameIDC;                                    END            END    --Hipótese 1.2.    ELSE BEGIN        -- Apenas precaução...        IF(@GameIDC IS NOT NULLBEGIN                        /*            |    Desnecessário checar se o char existe, porque se essa parte             |    do script está sendo executada, é porque o char foi logado            |    agora, logo é presumível que existe.            */                        SET @GameIDC_ConnectTM = (SELECT ConnectTM FROM Character WHERE AccountID = @Login AND Name = @GameIDC);            SET @GameIDC_ConnectTM_Int DATEDIFF(s'19700101', @GameIDC_ConnectTM);            SET @GameIDC_DisconnectTM_Int = @Now_Int;
                -- 
    Hipótese 1.2.1            IF @account_DisconnectTM_Int < @GameIDC_ConnectTM_IntBEGIN                                SET @TimeON = @GameIDC_DisconnectTM_Int - @GameIDC_ConnectTM_Int;                UPDATE Character SET TimeON TimeON + @TimeONDisConnectTM = @NowConnectTM = @Now WHERE AccountID = @Login AND Name = @GameIDC;                            END            -- Hipótese 1.2.2            ELSE BEGIN                /*                    Não é necessário atualizar tempo on, porque se o cara relogou a conta                    a WZ_DISCONNECT_MEMB já fez o serviço.                */                UPDATE Character SET ConnectTM = @Now WHERE AccountID = @Login AND Name = @GameIDC;                            END                        END            END    SET NOCOUNT OFFEND 

    ♦ PROCEDURE WZ_DISCONNECT_MEMB


    Código PHP:
    /*| @modifications - Renato Valer| @version - 2.0.0| @last update - 2015/08/28 - 09h25min| @warning: Não me responsabilizo por uso incorreto e possíveis deadlocks. Use por sua conta e risco.*/
    USE MuOnlineGO
    IF EXISTS (SELECT FROM sys.objects WHERE type 'P' AND name 'WZ_DISCONNECT_MEMB')DROP PROCEDURE [DBO].[WZ_DISCONNECT_MEMB]GO
    CREATE PROCEDURE 
    [DBO].[WZ_DISCONNECT_MEMB] @memb___id VARCHAR(10) AS BEGIN
    SET NOCOUNT ON
    DECLARE @Find_ID VARCHAR(10),@ConnectStat TINYINT,@LoginTime INT,@LogoutTime INT,@ConnectTM INT,@DisConnectTM INT,@TimeON_Account BIGINT,@TimeON_Char BIGINT,@GameIDC VARCHAR(10),@CharConnectTM DATETIME,@CharConnectTM_Int INT,@Now DATETIME,@Now_Int INT;
    SET @ConnectStat 0SET @Find_ID 'NOT'SET @Now GETDATE();
    SELECT @Find_ID S.memb___id FROM MEMB_STAT S INNER JOIN MEMB_INFO I ON S.memb___id COLLATE DATABASE_DEFAULT I.memb___id WHERE I.memb___id = @memb___id;
    IF( @
    Find_ID <> 'NOT' BEGIN    
    UPDATE MEMB_STAT SET ConnectStat 
    = @ConnectStatDisconnectTM = @Now WHERE memb___id = @memb___id;

    /*Selecionamos os momentos de login e logout da conta e convertemos para números inteiros.*/
    SET @ConnectTM = (SELECT DATEDIFF(s'19700101'MEMB_STAT.ConnectTMFROM MEMB_STAT WHERE memb___id = @memb___id);SET @DisConnectTM DATEDIFF(s'19700101', @Now);

    /*Executamos os cálculos para obtermos o tempo total online da conta.*/
    SET @TimeON_Account = @DisConnectTM - @ConnectTM;
    /*Atualizamos o tempo total online da conta.*/
    UPDATE MEMB_INFO SET TimeON TimeON + @TimeON_Account WHERE memb___id = @memb___id;

    /*Selecionando nick do último char logado*/    
    SET @GameIDC = (SELECT GameIDC FROM AccountCharacter WHERE Id = @memb___id);
    /*Algum char foi logado antes de sair da conta.Mesmo que o cara tenha logado na conta e criado o char, o GameIDCsó vai ser preenchido se o cara logar na conta.Sendo assim, se GameIDC for NULL, indica que nenhum charnunca foi logado nessa conta, então não tem necessidade de contar tempo on.*/    IF(@GameIDC IS NOT NULLBEGIN
    /*Verificamos se esse char existe.Motivo: o cara pode ter clicado em "selecionar char", deletado o char e depois deslogado da conta.Se não existe, não precisa fazer nada.*/IF EXISTS (SELECT Name FROM Character WHERE AccountID = @memb___id AND Name = @GameIDCBEGIN
    /*Verificação: quando foi o último connect desse char que acabou de deslogar?Se for nulo, significa que ocorreu algum problema na trigger, entãoadicionamos o valor de "agora" convertido em timestamp para possibilitar o cálculo.*/
    SET @CharConnectTM = (SELECT ConnectTM FROM Character WHERE AccountID = @memb___id AND Name = @GameIDC);IF (@CharConnectTM IS NULLBEGINSET @CharConnectTM_Int DATEDIFF(s'19700101', @Now);END/*Se não for nulo, convertemos para timestamp.*/ELSE BEGINSET @CharConnectTM_Int DATEDIFF(s'19700101', @CharConnectTM);END
    /*Executamos os cálculos para obtermos o tempo total onlinedo último char logado.*/
    SET @TimeON_Char = (@DisConnectTM - @CharConnectTM_Int);
    /*Atualizamos o tempo total online do último char logado.*/
    UPDATE Character SET TimeON TimeON + @TimeON_CharDisConnectTM = @Now WHERE AccountID = @memb___id AND Name = @GameIDC;    
    ENDENDENDSET NOCOUNT OFFEND 



    Atenção

    ATENÇÃO




    Não me responsabilizo por uso incorreto.
    Não me responsabilizo por eventuais deadlocks. Usem por conta e risco.


    Agradecimentos a @[Somente membros podem ver os links. ], @Willerson, @Erick-Master e @[Somente membros podem ver os links. ] pela colaboração.


    []'s



    Creditos Renato ( Imperyus )
    Last edited by cronusmaker; 06/05/2020 at 03:52 AM.
    [CENTER]

  2. #2
    Membro Rey Mysterious's Avatar
    Data de Ingresso
    Apr 2016
    Posts
    127
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    1
    Thanked in
    1 Post
    Mencionado
    16 Post(s)
    País
    Brazil
    Citação Originally Posted by cronusmaker Ver Post
    Atenção
    funciona melhor em sql 2008+


    Há tempos vejo pessoas pedindo query pra contar tempo online de char, então resolvi por a mão na massa e fazer uma.


    Se houver bugs eu fixo, só avisar aqui, mas aparentemente está 100% (fiz inúmeros testes).[B]

    A contagem é feita em segundos e é armazenada:

    - Tempo da conta: na MEMB_INFO, coluna TimeON.
    - Tempo de cada char: na Character, coluna TimeON.


    O tempo online é atualizado:

    - Quando você seleciona char (mesmo se não trocar de char).
    - Quando você troca de char.
    - Quando você desloga a conta.

    Vamos lá.


    [B] Versões atuais dos Scripts:

    - TRIGGER: 2.1.2
    - WZ_DISCONNECT_MEMB: 2.0.0


    [B] ALTER TABLES
    Código PHP:

    USE [MUOnline]
    GO

    ALTER TABLE 
    [dbo].[MEMB_STAT]
    ALTER COLUMN [ConnectTM] [datetimeNULL
    GO

    ALTER TABLE 
    [dbo].[MEMB_STAT]
    ALTER COLUMN [DisConnectTM] [datetimeNULL
    GO

    ALTER TABLE 
    [dbo].[MEMB_INFO]
    ADD    [TimeON] [bigintNOT NULL DEFAULT 0
    GO

    ALTER TABLE 
    [dbo].[Character]
    ADD    [ConnectTM] [datetimeNULL
    GO

    ALTER TABLE 
    [dbo].[Character]
    ADD    [DisConnectTM] [datetimeNULL
    GO

    ALTER TABLE  
    [dbo].[Character]
    ADD    [TimeON] [bigint] DEFAULT ((0)) NOT NULL
    GO 
    ♦ TRIGGER - AccountCharacter_Online

    Código PHP:
    /*
    | @author - Renato Valer
    | @version - 2.1.2
    | @last update - 2016/02/12 - 08h18min
    | @warning: Não me responsabilizo por uso incorreto e possíveis deadlocks. Use por sua conta e risco.
    */

    USE MuOnline
    GO

    IF EXISTS (SELECT name FROM sysobjects WHERE name 'AccountCharacter_Online' AND type 'TR')
        
    DROP TRIGGER [AccountCharacter_Online]
    GO

    CREATE TRIGGER 
    [AccountCharacter_OnlineON [dbo].[AccountCharacter
    AFTER UPDATE AS
        
    SET NOCOUNT ON

    /*
    |    Hipóteses
    |    
    |
    |        1 - Se GameIDC foi atualizado, algum char foi foi logado. Surgem hipóteses:
    |
    |            1.1 - GameIDC e Old_GameIDC são diferentes:
    |    
    |                1.1.1 - Old_GameIDC é NULL, logo é o primeiro char logado (e possivelmente o primeiro criado) na conta, 
    |                    pois não existe GameIDC anterior.
    |                1.1.2 - Já existe um GameIDC anterior, logo significa que o cara acessou outro char. Surgem 2 hipóteses:
    |
    |                    1.1.2.1 - O cara simplesmente trocou de char sem deslogar a conta:
    |                        1.1.2.1.1 - O cara logou um char, deletou ele e entrou em outro.
    |                    1.1.2.2 - O cara relogou a conta e entrou em outro char.
    |                        1.1.2.2.1 - O cara logou um char, deletou ele, saiu da conta, voltou e entrou em outro.
    |                        
    |            1.2 GameIDC e Old_GameIDC são iguais:
    |                        
    |                1.2.1 - O cara relogou o char.
    |                1.2.2 - O cara relogou a conta e entrou no mesmo char.
    |
    |        2. Se GameIDC não foi atualizado, não precisa fazer nada, porque significa:
    |        
    |            2.1 - Que um char foi criado, mas não foi logado.
    |            2.2 - Que um char foi deletado sem nem mesmo ter sido logado.
    |                
    |        
    */

    -- Hipótese 1
    IF UPDATE(GameIDCBEGIN

        
    DECLARE @Login VARCHAR(10),
        @
    GameIDC VARCHAR(10),
        @
    Old_GameIDC VARCHAR(10),
        @
    GameIDC_ConnectTM DATETIME,
        @
    GameIDC_ConnectTM_Int INT,
        @
    Old_GameIDC_ConnectTM DATETIME,
        @
    Old_GameIDC_ConnectTM_Int INT,
        @
    GameIDC_DisConnectTM DATETIME,
        @
    GameIDC_DisConnectTM_Int INT,
        @
    Old_GameIDC_DisConnectTM DATETIME,
        @
    Old_GameIDC_DisConnectTM_Int INT,
        [
    MENTION=3039]account[/MENTION]_DisconnectTM DATETIME,
        [
    MENTION=3039]account[/MENTION]_DisconnectTM_Int INT,
        @
    Now DATETIME,
        @
    Now_Int INT,
        @
    TimeON BIGINT;

        
    SET @Login = (SELECT Id FROM INSERTED);
        
    SET @GameIDC = (SELECT GameIDC FROM AccountCharacter WHERE Id = @Login);
        
    SET @Old_GameIDC = (SELECT GameIDC FROM DELETED);
        
    SET @Now GETDATE();
        
    SET @Now_Int DATEDIFF(s'19700101', @Now);
        
    SET [MENTION=3039]account[/MENTION]_DisconnectTM = (SELECT DisconnectTM FROM MEMB_STAT WHERE memb___id = @Login);
        
    SET [MENTION=3039]account[/MENTION]_DisconnectTM_Int DATEDIFF(s'19700101', [MENTION=3039]account[/MENTION]_DisconnectTM);

        -- 
    Hipótese 1.1
        
    IF(@GameIDC <> @Old_GameIDCBEGIN

            
    -- Hipótese 1.1.1
            
    IF(@Old_GameIDC IS NULLBEGIN
                
                UPDATE Character SET ConnectTM 
    = @Now WHERE AccountID = @Login AND Name = @GameIDC;
                
            
    END
            
    -- Hipótese 1.1.2
            
    ELSE BEGIN
            
                SET 
    @Old_GameIDC_DisconnectTM = @Now
                SET 
    @Old_GameIDC_DisconnectTM_Int = @Now_Int;
                
                -- 
    Hipótese 1.1.2.1
                
    IF [MENTION=3039]account[/MENTION]_DisconnectTM_Int <> @Old_GameIDC_DisconnectTM_IntBEGIN
                
                    
    -- Verificação da Hipótese 1.1.2.1.1
                    
    IF EXISTS(SELECT Name FROM Character WHERE AccountID = @Login AND Name = @Old_GameIDCBEGIN

                        SET 
    @Old_GameIDC_ConnectTM = (SELECT ConnectTM FROM Character WHERE AccountID = @Login AND Name = @Old_GameIDC);
                        
    SET @Old_GameIDC_ConnectTM_Int DATEDIFF(s'19700101', @Old_GameIDC_ConnectTM);
                
                        
    SET @TimeON = @Old_GameIDC_DisconnectTM_Int - @Old_GameIDC_ConnectTM_Int;
                    
                        
    UPDATE Character SET TimeON TimeON + @TimeONDisConnectTM = @Now WHERE AccountID = @Login AND Name = @Old_GameIDC;
                                        
                    
    END
                    
                END
                
    -- Hipótese 1.1.2.2 e "fim" da Hipótese 1.1.2.1
                
    -- A query é a mesma e um "else" é desnecessário.        
                
    /*
                |    Não é necessário atualizar tempo on, porque se o cara relogou a conta
                |    a WZ_DISCONNECT_MEMB já fez o serviço. Só precisamos atualizar o momento
                |    de connect do novo char.
                */
                
    UPDATE Character SET ConnectTM = @Now WHERE AccountID = @Login AND Name = @GameIDC;    
                            
            
    END
            
        END
        
    --Hipótese 1.2.
        ELSE 
    BEGIN
            
    -- Apenas precaução...
            IF(@
    GameIDC IS NOT NULLBEGIN
                
                
    /*
                |    Desnecessário checar se o char existe, porque se essa parte 
                |    do script está sendo executada, é porque o char foi logado
                |    agora, logo é presumível que existe.
                */
                
                
    SET @GameIDC_ConnectTM = (SELECT ConnectTM FROM Character WHERE AccountID = @Login AND Name = @GameIDC);
                
    SET @GameIDC_ConnectTM_Int DATEDIFF(s'19700101', @GameIDC_ConnectTM);
                
    SET @GameIDC_DisconnectTM_Int = @Now_Int;

                -- 
    Hipótese 1.2.1
                
    IF [MENTION=3039]account[/MENTION]_DisconnectTM_Int < @GameIDC_ConnectTM_IntBEGIN
                    
                    SET 
    @TimeON = @GameIDC_DisconnectTM_Int - @GameIDC_ConnectTM_Int;
                    
    UPDATE Character SET TimeON TimeON + @TimeONDisConnectTM = @NowConnectTM = @Now WHERE AccountID = @Login AND Name = @GameIDC;
                    
                
    END
                
    -- Hipótese 1.2.2
                
    ELSE BEGIN
                    
    /*
                        Não é necessário atualizar tempo on, porque se o cara relogou a conta
                        a WZ_DISCONNECT_MEMB já fez o serviço.
                    */
                    
    UPDATE Character SET ConnectTM = @Now WHERE AccountID = @Login AND Name = @GameIDC;
                    
                
    END    
                
            END
            
        END
        SET NOCOUNT OFF
    END 
    ♦ PROCEDURE WZ_DISCONNECT_MEMB

    Código PHP:

    /*
    | @modifications - Renato Valer
    | @version - 2.0.0
    | @last update - 2015/08/28 - 09h25min
    | @warning: Não me responsabilizo por uso incorreto e possíveis deadlocks. Use por sua conta e risco.
    */

    USE MuOnline
    GO

    IF EXISTS (SELECT FROM sys.objects WHERE type 'P' AND name 'WZ_DISCONNECT_MEMB')
    DROP PROCEDURE [DBO].[WZ_DISCONNECT_MEMB]
    GO

    CREATE PROCEDURE 
    [DBO].[WZ_DISCONNECT_MEMB] @memb___id VARCHAR(10) AS BEGIN

    SET NOCOUNT ON

    DECLARE @Find_ID VARCHAR(10),
    @
    ConnectStat TINYINT,
    @
    LoginTime INT,
    @
    LogoutTime INT,
    @
    ConnectTM INT,
    @
    DisConnectTM INT,
    @
    TimeON_Account BIGINT,
    @
    TimeON_Char BIGINT,
    @
    GameIDC VARCHAR(10),
    @
    CharConnectTM DATETIME,
    @
    CharConnectTM_Int INT,
    @
    Now DATETIME,
    @
    Now_Int INT;

    SET @ConnectStat 0
    SET 
    @Find_ID 'NOT'
    SET @Now GETDATE();

    SELECT @Find_ID S.memb___id FROM MEMB_STAT S INNER JOIN MEMB_INFO I ON S.memb___id COLLATE DATABASE_DEFAULT I.memb___id WHERE I.memb___id = @memb___id;

    IF( @
    Find_ID <> 'NOT' BEGIN    

    UPDATE MEMB_STAT SET ConnectStat 
    = @ConnectStatDisconnectTM = @Now WHERE memb___id = @memb___id;


    /*
    Selecionamos os momentos de login e logout da conta e convertemos para números inteiros.
    */

    SET @ConnectTM = (SELECT DATEDIFF(s'19700101'MEMB_STAT.ConnectTMFROM MEMB_STAT WHERE memb___id = @memb___id);
    SET @DisConnectTM DATEDIFF(s'19700101', @Now);


    /*
    Executamos os cálculos para obtermos o tempo total online da conta.
    */

    SET @TimeON_Account = @DisConnectTM - @ConnectTM;

    /*
    Atualizamos o tempo total online da conta.
    */

    UPDATE MEMB_INFO SET TimeON TimeON + @TimeON_Account WHERE memb___id = @memb___id;


    /*
    Selecionando nick do último char logado
    */    

    SET @GameIDC = (SELECT GameIDC FROM AccountCharacter WHERE Id = @memb___id);

    /*
    Algum char foi logado antes de sair da conta.
    Mesmo que o cara tenha logado na conta e criado o char, o GameIDC
    só vai ser preenchido se o cara logar na conta.
    Sendo assim, se GameIDC for NULL, indica que nenhum char
    nunca foi logado nessa conta, então não tem necessidade de contar tempo on.
    */    
    IF(@GameIDC IS NOT NULLBEGIN

    /*
    Verificamos se esse char existe.
    Motivo: o cara pode ter clicado em "selecionar char", deletado o char 
    e depois deslogado da conta.
    Se não existe, não precisa fazer nada.
    */
    IF EXISTS (SELECT Name FROM Character WHERE AccountID = @memb___id AND Name = @GameIDCBEGIN

    /*
    Verificação: quando foi o último connect desse char que acabou de deslogar?
    Se for nulo, significa que ocorreu algum problema na trigger, então
    adicionamos o valor de "agora" convertido em timestamp para possibilitar o cálculo.
    */

    SET @CharConnectTM = (SELECT ConnectTM FROM Character WHERE AccountID = @memb___id AND Name = @GameIDC);
    IF (@
    CharConnectTM IS NULLBEGIN
    SET 
    @CharConnectTM_Int DATEDIFF(s'19700101', @Now);
    END
    /*
    Se não for nulo, convertemos para timestamp.
    */
    ELSE BEGIN
    SET 
    @CharConnectTM_Int DATEDIFF(s'19700101', @CharConnectTM);
    END

    /*
    Executamos os cálculos para obtermos o tempo total online
    do último char logado.
    */

    SET @TimeON_Char = (@DisConnectTM - @CharConnectTM_Int);

    /*
    Atualizamos o tempo total online do último char logado.
    */

    UPDATE Character SET TimeON TimeON + @TimeON_CharDisConnectTM = @Now WHERE AccountID = @memb___id AND Name = @GameIDC;    

    END
    END
    END
    SET NOCOUNT OFF
    END 

    Atenção
    ATENÇÃO


    Não me responsabilizo por uso incorreto.
    Não me responsabilizo por eventuais deadlocks. Usem por conta e risco.

    Agradecimentos a @[Somente membros podem ver os links. ], @Willerson, @Erick-Master e @[Somente membros podem ver os links. ] pela colaboração.

    []'s


    Creditos Renato ( Imperyus )

    obrigado por tentar ajudar , quando executo a query da parte " TRIGGER - AccountCharacter_Online" acontece esse erro?

    Msg 102, Level 15, State 1, Procedure AccountCharacter_Online, Line 56Incorrect syntax near 'MENTION=3039'.
    Msg 137, Level 15, State 1, Procedure AccountCharacter_Online, Line 62
    Must declare the scalar variable "@Login".
    Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 63
    Must declare the scalar variable "@Login".
    Msg 137, Level 15, State 1, Procedure AccountCharacter_Online, Line 64
    Must declare the scalar variable "@Old_GameIDC".
    Msg 137, Level 15, State 1, Procedure AccountCharacter_Online, Line 65
    Must declare the scalar variable "@Now".
    Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 66
    Must declare the scalar variable "@Now".
    Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 67
    Must declare the scalar variable "@Login".
    Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 71
    Must declare the scalar variable "@GameIDC".
    Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 74
    Must declare the scalar variable "@Old_GameIDC".
    Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 76
    Must declare the scalar variable "@Now".
    Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 82
    Must declare the scalar variable "@Now".
    Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 83
    Must declare the scalar variable "@Now_Int".
    Msg 4145, Level 15, State 1, Procedure AccountCharacter_Online, Line 86
    An expression of non-boolean type specified in a context where a condition is expected, near 'account'.
    Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 89
    Must declare the scalar variable "@Login".
    Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 91
    Must declare the scalar variable "@Login".
    Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 92
    Must declare the scalar variable "@Old_GameIDC_ConnectTM".
    Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 94
    Must declare the scalar variable "@Old_GameIDC_DisconnectTM_Int".
    Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 96
    Must declare the scalar variable "@TimeON".
    Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 108
    Must declare the scalar variable "@Now".
    Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 116
    Must declare the scalar variable "@GameIDC".
    Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 124
    Must declare the scalar variable "@Login".
    Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 125
    Must declare the scalar variable "@GameIDC_ConnectTM".
    Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 126
    Must declare the scalar variable "@Now_Int".
    Msg 4145, Level 15, State 1, Procedure AccountCharacter_Online, Line 129
    An expression of non-boolean type specified in a context where a condition is expected, near 'account'.
    Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 131
    Must declare the scalar variable "@GameIDC_DisconnectTM_Int".
    Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 132
    Must declare the scalar variable "@TimeON".
    Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 141
    Must declare the scalar variable "@Now".

  3. #3
    Membro cronusmaker's Avatar
    Data de Ingresso
    May 2015
    Posts
    473
    Thanks Thanks Given 
    5
    Thanks Thanks Received 
    11
    Thanked in
    9 Posts
    Mencionado
    13 Post(s)
    MEU HUMOR
    Buzzed
    País
    Brazil
    qual a versão do seu sql ?
    [CENTER]

  4. #4
    Membro Rey Mysterious's Avatar
    Data de Ingresso
    Apr 2016
    Posts
    127
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    1
    Thanked in
    1 Post
    Mencionado
    16 Post(s)
    País
    Brazil
    Citação Originally Posted by cronusmaker Ver Post
    qual a versão do seu sql ?
    a versão é sql server 2014 enterprise

  5. #5
    Membro rengar157's Avatar
    Data de Ingresso
    Apr 2018
    Posts
    10
    Thanks Thanks Given 
    4
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    Mencionado
    0 Post(s)
    País
    Brazil
    aqui tbm nao funciona.. sql server 2012.. mesmo erro do amigo acima..

  6. #6
    Membro cronusmaker's Avatar
    Data de Ingresso
    May 2015
    Posts
    473
    Thanks Thanks Given 
    5
    Thanks Thanks Received 
    11
    Thanked in
    9 Posts
    Mencionado
    13 Post(s)
    MEU HUMOR
    Buzzed
    País
    Brazil
    vou postar la no topico original e ver se o cara responde
    @[Somente membros podem ver os links. ] tem como fixar esse topico sempre que coloca @[Somente membros podem ver os links. ] ta reconhecendo alguma conta no forum e ta dando conflito no topico

    MENTION=3039

    se puder trocar o nick do usuario para que esse conflito não ocorra em futuros posts pois isso prejudica qualquer query ou producere
    Last edited by cronusmaker; 05/05/2020 at 02:47 PM.
    [CENTER]

  7. #7
    Fundador PerfectZone Mentor's Avatar


    Data de Ingresso
    Jun 2013
    Posts
    2,850
    Thanks Thanks Given 
    784
    Thanks Thanks Received 
    2,187
    Thanked in
    355 Posts
    Mencionado
    804 Post(s)
    MEU HUMOR
    Twisted
    País
    Brazil
    Citação Originally Posted by cronusmaker Ver Post
    vou postar la no topico original e ver se o cara responde
    @[Somente membros podem ver os links. ] tem como fixar esse topico sempre que coloca @[Somente membros podem ver os links. ] ta reconhecendo alguma conta no forum e ta dando conflito no topico

    MENTION=3039

    se puder trocar o nick do usuario para que esse conflito não ocorra em futuros posts pois isso prejudica qualquer query ou producere
    Estarei verificando, pois não adianta editar o nick e outra pessoa cadastrar no fórum criando esse mesmo nick, estarei editando e buscando uma forma de bloquear a utilização desse nick.

    Abraço!

    ____edit


    Nickname mudado para acc0ount e Nick account bloqueado para uso, depois edite seu tópico para corrigir o problema.
    Last edited by Mentor; 06/05/2020 at 07:28 AM.
    Perfect Zone Brasil



    Inscreva-se no meu canal clicando [Somente membros podem ver os links. ]

  8. #8
    Membro cronusmaker's Avatar
    Data de Ingresso
    May 2015
    Posts
    473
    Thanks Thanks Given 
    5
    Thanks Thanks Received 
    11
    Thanked in
    9 Posts
    Mencionado
    13 Post(s)
    MEU HUMOR
    Buzzed
    País
    Brazil
    Citação Originally Posted by rey mysterious Ver Post
    a versão é sql server 2014 enterprise
    Citação Originally Posted by rengar157 Ver Post
    aqui tbm nao funciona.. Sql server 2012.. Mesmo erro do amigo acima..
    problema resolvido
    [CENTER]

  9. #9
    Membro traxxx's Avatar
    Data de Ingresso
    Nov 2016
    Posts
    13
    Thanks Thanks Given 
    3
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    Mencionado
    0 Post(s)
    País
    Brazil
    funciona em mu emu s8?

Permissões de Postagem

  • Você não pode iniciar novos tópicos
  • You may not post Resposta(s)
  • Você não pode enviar anexos
  • Você não pode editar suas mensagens
  •  
Sobre nós
Somos uma comunidade em atividade a 8 anos que aborda assuntos relacionados a games em geral, principalmente games MMORPG. e que busca sempre ajudar os membros através de conteúdos, tutoriais e suporte...
Nossos anunciantes
Hinetworks
VelozHost
InovHost
Rede Sociais