none
Data inicio e Data Fim RRS feed

  • Pergunta

  • Ola´Pessoal,

    Tenho uma tabela de movimentação de funcinário e preciso exibir duas colunas na minha query: uma com o INICIO e outra com o FIM de período para cada funcionário, ou seja, o período em que cada funcionário trabalhou no departamento.

    Por exemplo para o funcionário numero 762 trabalhou no departamento 5869 até 31-12-2011 e a partir de 01-01-2012 começou a trabalhar no departamento 5692:

    CREATE TABLE #TBMOVIMENTO(
     ID                      INT IDENTITY(1,1) NOT NULL
    , COD_FUNC               VARCHAR(9) NULL
    , DEPARTAMENTO_ORIGEM    VARCHAR(11) NULL
    , DEPARTAMENTO_DESTINO   VARCHAR(9) NULL
    , DATA_ATUALIZACAO       DATETIME   NULL
    CONSTRAINT [PK_TBMOVIMENTO] PRIMARY KEY CLUSTERED 
    (
    	ID ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    
    
    INSERT INTO #TBMOVIMENTO (COD_FUNC, DEPARTAMENTO_ORIGEM, DEPARTAMENTO_DESTINO, DATA_ATUALIZACAO) VALUES ('762','5869','5692','2012-01-01 00:00:00.000')
    INSERT INTO #TBMOVIMENTO (COD_FUNC, DEPARTAMENTO_ORIGEM, DEPARTAMENTO_DESTINO, DATA_ATUALIZACAO) VALUES ('762','5692','5316','2012-06-01 00:00:00.000')
    INSERT INTO #TBMOVIMENTO (COD_FUNC, DEPARTAMENTO_ORIGEM, DEPARTAMENTO_DESTINO, DATA_ATUALIZACAO) VALUES ('762','5316','4473','2013-01-01 00:00:00.000')
    INSERT INTO #TBMOVIMENTO (COD_FUNC, DEPARTAMENTO_ORIGEM, DEPARTAMENTO_DESTINO, DATA_ATUALIZACAO) VALUES ('762','4473','4539','2014-12-01 00:00:00.000')

    oBRIGADO!


    Obrigado

    segunda-feira, 2 de fevereiro de 2015 20:33

Respostas

  • Boa tarde,

    Experimente dessa forma:

    select
        t.COD_FUNC,
        t.DEPARTAMENTO_ORIGEM as Departamento,
        (select top 1 s.DATA_ATUALIZACAO
         from #TBMOVIMENTO as s
         where 
             s.COD_FUNC = t.COD_FUNC and 
             s.DATA_ATUALIZACAO < t.DATA_ATUALIZACAO
         order by s.DATA_ATUALIZACAO DESC) as Inicio,
        DATEADD(DAY, -1, t.DATA_ATUALIZACAO) as Fim
    from #TBMOVIMENTO as t

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    Obrigado ! É isso mesmo que eu precisava !

    Abçs,


    Obrigado

    • Marcado como Resposta A.J.C. _ terça-feira, 3 de fevereiro de 2015 11:07
    terça-feira, 3 de fevereiro de 2015 11:07

Todas as Respostas

  • Boa tarde,

    Experimente dessa forma:

    select
        t.COD_FUNC,
        t.DEPARTAMENTO_ORIGEM as Departamento,
        (select top 1 s.DATA_ATUALIZACAO
         from #TBMOVIMENTO as s
         where 
             s.COD_FUNC = t.COD_FUNC and 
             s.DATA_ATUALIZACAO < t.DATA_ATUALIZACAO
         order by s.DATA_ATUALIZACAO DESC) as Inicio,
        DATEADD(DAY, -1, t.DATA_ATUALIZACAO) as Fim
    from #TBMOVIMENTO as t

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    segunda-feira, 2 de fevereiro de 2015 20:58
  • A partir do SQL Server 2012 pode ser utilizada a função Lag:

    select
        COD_FUNC,
        DEPARTAMENTO_ORIGEM as Departamento,
        LAG(DATA_ATUALIZACAO, 1) OVER(PARTITION BY COD_FUNC ORDER BY DATA_ATUALIZACAO) as Inicio,
        DATEADD(DAY, -1, DATA_ATUALIZACAO) as Fim
    from #TBMOVIMENTO

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br


    • Editado gapimex segunda-feira, 2 de fevereiro de 2015 22:10
    • Sugerido como Resposta Junior Galvão - MVPMVP quarta-feira, 4 de fevereiro de 2015 14:52
    segunda-feira, 2 de fevereiro de 2015 22:10
  • Deleted
    segunda-feira, 2 de fevereiro de 2015 23:46
  • A partir do SQL Server 2012 pode ser utilizada a função Lag:

    select
        COD_FUNC,
        DEPARTAMENTO_ORIGEM as Departamento,
        LAG(DATA_ATUALIZACAO, 1) OVER(PARTITION BY COD_FUNC ORDER BY DATA_ATUALIZACAO) as Inicio,
        DATEADD(DAY, -1, DATA_ATUALIZACAO) as Fim
    from #TBMOVIMENTO

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br


    Obrigado pela dica, mas o SQL Server que eu uso é o 2008 R2

    Obrigado

    terça-feira, 3 de fevereiro de 2015 11:06
  • Boa tarde,

    Experimente dessa forma:

    select
        t.COD_FUNC,
        t.DEPARTAMENTO_ORIGEM as Departamento,
        (select top 1 s.DATA_ATUALIZACAO
         from #TBMOVIMENTO as s
         where 
             s.COD_FUNC = t.COD_FUNC and 
             s.DATA_ATUALIZACAO < t.DATA_ATUALIZACAO
         order by s.DATA_ATUALIZACAO DESC) as Inicio,
        DATEADD(DAY, -1, t.DATA_ATUALIZACAO) as Fim
    from #TBMOVIMENTO as t

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    Obrigado ! É isso mesmo que eu precisava !

    Abçs,


    Obrigado

    • Marcado como Resposta A.J.C. _ terça-feira, 3 de fevereiro de 2015 11:07
    terça-feira, 3 de fevereiro de 2015 11:07