INSERIR EM COLUNAS DIFERENTES HORAS DA MESMA DATA

16/04/2018

0

Eu tenho uma tabela com dois campos ID e DATA_HORA:

ID | DATA_HORA

ID DATA_HORA
1 2018-03-01 09:06:19.0000000
1 2018-03-01 12:06:19.0000000
1 2018-03-01 13:00:19.0000000
1 2018-03-01 18:00:19.0000000
1 2018-03-02 09:00:00.0000000
1 2018-03-02 12:00:00.0000000
1 2018-03-02 13:00:00.0000000
1 2018-03-02 18:00:00.0000000
1 2018-03-05 09:00:00.0000000
1 2018-03-05 12:00:00.0000000
1 2018-03-05 13:00:00.0000000
1 2018-03-05 18:00:00.0000000
2 2018-03-01 09:06:19.0000000
2 2018-03-01 12:06:19.0000000
2 2018-03-01 13:00:19.0000000
2 2018-03-01 18:00:19.0000000
2 2018-03-02 09:00:00.0000000
2 2018-03-02 12:00:00.0000000
2 2018-03-02 13:00:00.0000000
2 2018-03-02 18:00:00.0000000
2 2018-03-05 09:00:00.0000000
2 2018-03-05 12:00:00.0000000
2 2018-03-05 13:00:00.0000000
2 2018-03-05 18:00:00.0000000

Mas preciso separar em colunas os horários do mesmo dia:

ID_FUNCIONARIO DATA_HORA Entrada1 Saida1 Entrada2 Saida2
1 01/03/2018 09:06:19 12:06:19 13:00:19 18:00:19
2 01/03/2018 09:06:19 12:06:19 13:00:19 18:00:19
1 02/03/2018 09:00:00 12:00:00 13:00:00 18:00:00
2 02/03/2018 09:00:00 12:00:00 13:00:00 18:00:00
1 05/03/2018 09:00:00 12:00:00 13:00:00 18:00:00
2 05/03/2018 09:00:00 12:00:00 13:00:00 18:00:00

Consegui exibir somente o primeiro e último registro do dia:

SELECT ID_FUNCIONARIO, CONVERT(CHAR(10),DATA_HORA,103) AS DATA_HORA, MIN(DATA_HORA) AS Entrada1, MAX(DATA_HORA) AS Saida2 FROM ACESSO GROUP BY ID_FUNCIONARIO, CONVERT(CHAR(10),DATA_HORA,103)

ID_FUNCIONARIO DATA_HORA Entrada1 Saida2
1 01/03/2018 2018-03-01 09:06:19.0000000 2018-03-01 18:00:19.0000000
2 01/03/2018 2018-03-01 09:06:19.0000000 2018-03-01 18:00:19.0000000
1 02/03/2018 2018-03-02 09:00:00.0000000 2018-03-02 18:00:00.0000000
2 02/03/2018 2018-03-02 09:00:00.0000000 2018-03-02 18:00:00.0000000
1 05/03/2018 2018-03-05 09:00:00.0000000 2018-03-05 18:00:00.0000000
2 05/03/2018 2018-03-05 09:00:00.0000000 2018-03-05 18:00:00.0000000

Como faço para consultar todos os horários do mesmo dia?
Karina Alves

Karina Alves

Responder

Post mais votado

16/04/2018

Se for usar o SQL SERVER poderia da uma olhada nesse sql
SELECT 
	ID AS Funcionario, 
	CONVERT(CHAR(10), p1.data_hora,103) AS Data_Ponto,
	Horarios = STUFF((
          SELECT ',' + SUBSTRING(CONVERT(VARCHAR,p2.data_hora,114),1,8)
          FROM ponto p2
          WHERE p2.ID = p1.ID AND CONVERT(CHAR(10), p2.data_hora,103) = CONVERT(CHAR(10), p1.data_hora,103)
          FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
FROM
	ponto as p1
WHERE p1.ID = 1
AND CONVERT(CHAR(10), p1.data_hora,103) BETWEEN @DATAINICIAL AND @DATAFINAL
GROUP BY p1.ID, p1.data_hora



Se for Usar o MYSQL

SELECT 
  id As Codigo,
  CAST(data_hora AS DATE) AS Data_Agora,
  GROUP_CONCAT(DATE_FORMAT(data_hora, '%T')) As Horarios
FROM 
  PONTO
GROUP BY ID, Data_Agora


Dai no retorno do campo horários, você pode da um explode com separador , e assim você tem um array com os horarios de entrada e saida, após isso é so monta o front

Willian Silva

Willian Silva
Responder

Mais Posts

16/04/2018

Rodrigo Pinto

Tenta isso.
SELECT ID_FUNCIONARIO, CONVERT(CHAR(10),DATA_HORA,103) AS DATA_HORA, MIN(DATA_HORA) AS Entrada1, MAX(DATA_HORA) AS Saida2 FROM ACESSO where DAY(DATA_HORA) = 2 GROUP BY ID_FUNCIONARIO, CONVERT(CHAR(10),DATA_HORA,103)
Responder

16/04/2018

Karina Alves

Agradeço muito a resposta, mas não deu certo, porque continua listanto o primeiro e o último registro do dia.
Preciso que liste a data, o primeiro horário, segundo horário e assim sucessivamente.
Vai ficar ID | DATA | ENTRADA1 | SAIDA1 | ENTRADA2 | SAIDA2 | ENTRADA3 | SAIDA3
Ou seja, int | date | time | time | time | time | time | time.
Responder

16/04/2018

Willian Silva

para teste -> http://sqlfiddle.com/#!9/423c2/10
Responder

16/04/2018

Karina Alves

Cara sensacional!
Não tinha achado nenhum material na net, nenhum amigo fera meu me deu a resposta e você conseguiu e deixou prontinho pra eu criar o fronte!
Muito obrigada!
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar