none
DATEDIFF - Dúvidas RRS feed

  • Pergunta

  • Tenho uma tabela  MARC

    Preciso somar essas horas.

    ele precisa trazer 

    IGOR  / 8 HORAS

    JOAO PEDRO  / 8 HORAS

    SELECT user_marc nome , DATEDIFF(HOUR,SUM(data_marc),SUM(data_marc) 
    FROM marc

    no sql 

    IDMARC	USER_MARC	DATA_MARC
    15	IGOR	        01/01/2019 08:00
    17	IGOR	        01/01/2019 17:00
    20	IGOR	        02/01/2019 08:00
    1	JOAO PEDRO	01/01/2019 08:00
    4	JOAO PEDRO	01/01/2019 17:00
    5	JOAO PEDRO	02/01/2019 08:00
    16	JOAO PEDRO	02/01/2019 17:00
    10	LINDOMAR N	01/01/2019 08:00
    11	LINDOMAR N	01/01/2019 17:00
    12	LINDOMAR N	02/01/2019 08:00
    3	LUCAS	        01/01/2019 08:00
    18	LUCAS	        01/01/2019 17:50
    19	MANUAL	        01/01/2019 08:00
    13	MANUEL	        01/01/2019 17:00
    14	MANUEL	        02/01/2019 08:00
    6	MARIA	        01/01/2019 08:00
    7	MARIA	        01/01/2019 17:00
    8	MARIA	        02/01/2019 08:00
    9	MARIA	        02/01/2019 17:00
    2	MATHEUS	        01/01/2019 08:00
    



    Droberti

    sexta-feira, 14 de junho de 2019 19:03

Respostas

  • Experimente fazer uns testes mais ou menos dessa forma:

    with CTE_RN as
    (
        SELECT 
            user_marc, 
            data_marc,
            row_number() over(partition by user_marc order by data_marc) as RN
        FROM marc
    )
    
    select
        e.user_marc,
        sum(datediff(hour, e.data_marc, s.data_marc))
    from CTE_RN as e
    inner join CTE_RN as s
        on
            s.user_marc = e.user_marc and
            s.RN = e.RN + 1
    where
        e.RN % 2 = 1
    group by
        e.user_marc

    Espero que ajude


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


    • Editado gapimex sexta-feira, 14 de junho de 2019 20:56 correção no Join
    • Sugerido como Resposta Junior Galvão - MVPMVP domingo, 16 de junho de 2019 00:10
    • Marcado como Resposta José Diz terça-feira, 25 de junho de 2019 11:48
    sexta-feira, 14 de junho de 2019 20:30
  • SELECT * FROM
    (SELECT USER_MARC NOME, CAST(DATA_MARC AS DATE) DATA,
           DATEDIFF(HH, DATA_MARC, LEAD(DATA_MARC) OVER(PARTITION BY USER_MARC, CAST(DATA_MARC AS DATE) ORDER BY DATA_MARC)) HORAS
    FROM MARC) F
    WHERE HORAS IS NOT NULL
    • Marcado como Resposta José Diz terça-feira, 25 de junho de 2019 11:49
    segunda-feira, 17 de junho de 2019 22:05
  • Pra falar a verdade.

    As opiniões que mais chegaram perto, foram a de criar um sub select.

    Já consegui resolver e utilizar o seguinte código:

    SELECT X.SETOR,
    X.PROFISSIOANL,
    X.DATA,
    X.HORAI,
    X.HORAF,
    DATEDIFF(HH,X.HORAI,X.HORAF) TOTAL,
    X.DIA,
    X.LOCAL
    FROM (
    SELECT DISTINCT SETOR_DESCR SETOR,
    SMPESSOA_NOME PROFISSIONAL,
    (
    SELECT MIN(CONVERT(VARCHAR, MARC_DATA, 103))
    FROM MARC MARC
    WHERE DEPARTAMENTO_ID = MARC_IDDEPARTAMENTO
    ) DATA,
    (
    SELECT MIN(CONVERT(VARCHAR(5), MARC_DATA, 108))
    FROM MARC 
    WHERE DEPARTAMENTO_ID = MARC_IDDEPARTAMENTO
    ) HORAI,
    (
    SELECT MAX(CONVERT(VARCHAR(5), MARC_DATA, 108))
    FROM MARC 
    WHERE DEPARTAMENTO_ID = MARC_IDDEPARTAMENTO
    ) HORAF,
    CASE DATEPART(DW,MARC_DATA)
    WHEN 2 THEN
    'SEGUNDA'
    WHEN 3 THEN 
    'TERCA'
    WHEN 4 THEN 
    'QUARTA'
    WHEN 5 THEN
    'QUINTA'
    WHEN 6 THEN
    'SEXTA'
    WHEN 7 THEN 
    'SABADO'
    ELSE
    'DOMINGO'
    END DIA,
    SMLOCAL_DESCR LOCAL

    FROM DEPARTAMENTO JOIN SMPESSOA ON SMPESSOA_ID = DEPARTAMENTO_IDTECNICO
    JOIN MARC ON MARC_IDDEPARTAMENTO = DEPARTAMENTO_ID
    JOIN SMLOCAL ON SMLOCAL_ID = DEPARTAMENTO_LOCALDP
    JOIN SETOR ON SETOR_ID = DEPARTAMENTO_IDSETOR
    WHERE DEPARTAMENTO_STATUS = 'A'
     
    --AND MARC_DATA BETWEEN '#INICIAL# 00:01' AND '#FINAL# 23:59' 

    GROUP BY DEPARTAMENTO_ID,
    SMPESSOA_NOME,
    MARC_DATA,
    SMLOCAL_DESCR,
    SETOR_DESCR
    )X
    ORDER BY 1


    Droberti

    • Marcado como Resposta Drobertii quarta-feira, 26 de junho de 2019 19:57
    quarta-feira, 26 de junho de 2019 19:57

Todas as Respostas

  • Boa tarde,

    Considerando os dados que você postou acima, qual seria o resultado esperado?

    E como teria que ser feito o calculo para chegar a esse resultado?


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

    sexta-feira, 14 de junho de 2019 19:35
  • Cara,

    Preciso somar o total de horas trabalhadas por usuário.

    Tenho apenas 1 tabela (dbo.marc) na qual registra os pontos em lista (conforme anexo) preciso saber quantas hora o Igor trabalhou. Então, se ele entrou as 08:00 (IDMARC=15) e saiu às 17:00(idmarc=17)  ele trabalhou 8 hora. Mas quando isso o datediff(hour(max(data_marc), min(data_marc)) ele mostra zerado.


    Droberti

    sexta-feira, 14 de junho de 2019 20:15
  • Experimente fazer uns testes mais ou menos dessa forma:

    with CTE_RN as
    (
        SELECT 
            user_marc, 
            data_marc,
            row_number() over(partition by user_marc order by data_marc) as RN
        FROM marc
    )
    
    select
        e.user_marc,
        sum(datediff(hour, e.data_marc, s.data_marc))
    from CTE_RN as e
    inner join CTE_RN as s
        on
            s.user_marc = e.user_marc and
            s.RN = e.RN + 1
    where
        e.RN % 2 = 1
    group by
        e.user_marc

    Espero que ajude


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


    • Editado gapimex sexta-feira, 14 de junho de 2019 20:56 correção no Join
    • Sugerido como Resposta Junior Galvão - MVPMVP domingo, 16 de junho de 2019 00:10
    • Marcado como Resposta José Diz terça-feira, 25 de junho de 2019 11:48
    sexta-feira, 14 de junho de 2019 20:30
  • SELECT * FROM
    (SELECT USER_MARC NOME, CAST(DATA_MARC AS DATE) DATA,
           DATEDIFF(HH, DATA_MARC, LEAD(DATA_MARC) OVER(PARTITION BY USER_MARC, CAST(DATA_MARC AS DATE) ORDER BY DATA_MARC)) HORAS
    FROM MARC) F
    WHERE HORAS IS NOT NULL
    • Marcado como Resposta José Diz terça-feira, 25 de junho de 2019 11:49
    segunda-feira, 17 de junho de 2019 22:05
  • Boa noite!

    Tente isso:

    SELECT USER_MARC NOME, CAST(DATA_MARC AS DATE) DATA, 

           DATEDIFF(HH, DATA_MARC, LEAD(DATA_MARC) OVER(PARTITION BY USER_MARC, CAST(DATA_MARC AS DATE) ORDER BY DATA_MARC)) HORAS
    FROM MARC) F
    WHERE HORAS IS NOT NULL

    terça-feira, 18 de junho de 2019 01:15
  • Pra falar a verdade.

    As opiniões que mais chegaram perto, foram a de criar um sub select.

    Já consegui resolver e utilizar o seguinte código:

    SELECT X.SETOR,
    X.PROFISSIOANL,
    X.DATA,
    X.HORAI,
    X.HORAF,
    DATEDIFF(HH,X.HORAI,X.HORAF) TOTAL,
    X.DIA,
    X.LOCAL
    FROM (
    SELECT DISTINCT SETOR_DESCR SETOR,
    SMPESSOA_NOME PROFISSIONAL,
    (
    SELECT MIN(CONVERT(VARCHAR, MARC_DATA, 103))
    FROM MARC MARC
    WHERE DEPARTAMENTO_ID = MARC_IDDEPARTAMENTO
    ) DATA,
    (
    SELECT MIN(CONVERT(VARCHAR(5), MARC_DATA, 108))
    FROM MARC 
    WHERE DEPARTAMENTO_ID = MARC_IDDEPARTAMENTO
    ) HORAI,
    (
    SELECT MAX(CONVERT(VARCHAR(5), MARC_DATA, 108))
    FROM MARC 
    WHERE DEPARTAMENTO_ID = MARC_IDDEPARTAMENTO
    ) HORAF,
    CASE DATEPART(DW,MARC_DATA)
    WHEN 2 THEN
    'SEGUNDA'
    WHEN 3 THEN 
    'TERCA'
    WHEN 4 THEN 
    'QUARTA'
    WHEN 5 THEN
    'QUINTA'
    WHEN 6 THEN
    'SEXTA'
    WHEN 7 THEN 
    'SABADO'
    ELSE
    'DOMINGO'
    END DIA,
    SMLOCAL_DESCR LOCAL

    FROM DEPARTAMENTO JOIN SMPESSOA ON SMPESSOA_ID = DEPARTAMENTO_IDTECNICO
    JOIN MARC ON MARC_IDDEPARTAMENTO = DEPARTAMENTO_ID
    JOIN SMLOCAL ON SMLOCAL_ID = DEPARTAMENTO_LOCALDP
    JOIN SETOR ON SETOR_ID = DEPARTAMENTO_IDSETOR
    WHERE DEPARTAMENTO_STATUS = 'A'
     
    --AND MARC_DATA BETWEEN '#INICIAL# 00:01' AND '#FINAL# 23:59' 

    GROUP BY DEPARTAMENTO_ID,
    SMPESSOA_NOME,
    MARC_DATA,
    SMLOCAL_DESCR,
    SETOR_DESCR
    )X
    ORDER BY 1


    Droberti

    • Marcado como Resposta Drobertii quarta-feira, 26 de junho de 2019 19:57
    quarta-feira, 26 de junho de 2019 19:57