TransWikia.com

Agrupar por fecha + Hora dinámico

Stack Overflow en español Asked on December 22, 2021

Tengo la siguiente estructura:

name  fecha               valor
b1    12/07/2017 19:45     200
b1    12/07/2017 19:50     220
b1    12/07/2017 19:55     221
...
b1    13/07/2017 00:59     425

Es una tabla donde se guardan registros cada 5 minutos para cada name (b1, b2, b3… etc.) Necesito que los registros se agrupen por rango de horas es decir, 08:30 (del día presente) -> 01:00(del próximo día) y me genere un resultado así:

b1                       12/07/2017             1066    

                

Ejemplo: El día 12 me contempla desde 12/07/2017 08:30 am -> 13/07/2017 01:00 am

Teniendo presente que las fechas son dinámicas.

2 Answers

Al guardar cada registro guárdalos como” timestamp” Para esto en tu tabla de MYSQL el campo que tienes con el nombre fecha hazlo tipo timestamp.

ALTER TABLE `nombre_de_tu_tabla` CHANGE `fecha` `fecha` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;

Le puedes poner default la fecha actual del momento cuando se guarda o NULL. Solo asegúrate de configurar la hora del servidor o enviarlo desde tu código en el formato adecuado para timestamp. Después de eso basta con hacer la consulta por fecha:

SELECT * FROM `nombre_de_tu_tabla` ORDER BY `nombre_de_tu_tabla`.`fecha` ASC

Answered by crazyProgrammer on December 22, 2021

Simule el código en una tabla temporal solo haz los cambios que necesites

Tabla temporal

create table #tabla (
Name varchar(50),
Fecha datetime,
Valor int)

Registros

INSERT INTO #Tabla SELECT 'A', '2017-08-01 10:45', 500
INSERT INTO #Tabla SELECT 'A', '2017-08-01 11:45', 500
INSERT INTO #Tabla SELECT 'A', '2017-08-01 12:45', 180
INSERT INTO #Tabla SELECT 'A', '2017-08-01 13:45', 500
INSERT INTO #Tabla SELECT 'A', '2017-08-01 14:45', 500
INSERT INTO #Tabla SELECT 'A', '2017-08-01 15:45', 352
INSERT INTO #Tabla SELECT 'A', '2017-08-01 16:45', 500
INSERT INTO #Tabla SELECT 'A', '2017-08-01 17:45', 500
INSERT INTO #Tabla SELECT 'A', '2017-08-01 18:45', 352
INSERT INTO #Tabla SELECT 'A', '2017-08-01 19:45', 500
INSERT INTO #Tabla SELECT 'A', '2017-08-01 20:45', 352
INSERT INTO #Tabla SELECT 'A', '2017-08-01 21:45', 500
INSERT INTO #Tabla SELECT 'A', '2017-08-01 23:45', 100
INSERT INTO #Tabla SELECT 'A', '2017-08-02 00:45', 100
INSERT INTO #Tabla SELECT 'A', '2017-08-02 01:45', 450
INSERT INTO #Tabla SELECT 'A', '2017-08-02 02:45', 450
INSERT INTO #Tabla SELECT 'A', '2017-08-02 05:45', 300
INSERT INTO #Tabla SELECT 'A', '2017-08-02 13:45', 200
INSERT INTO #Tabla SELECT 'A', '2017-08-02 10:45', 352
INSERT INTO #Tabla SELECT 'A', '2017-08-02 11:45', 500
INSERT INTO #Tabla SELECT 'A', '2017-08-02 12:45', 352
INSERT INTO #Tabla SELECT 'A', '2017-08-02 13:45', 500
INSERT INTO #Tabla SELECT 'A', '2017-08-02 14:45', 500
INSERT INTO #Tabla SELECT 'A', '2017-08-02 15:45', 352
INSERT INTO #Tabla SELECT 'A', '2017-08-02 16:45', 500
INSERT INTO #Tabla SELECT 'A', '2017-08-02 17:45', 180
INSERT INTO #Tabla SELECT 'A', '2017-08-02 18:45', 352
INSERT INTO #Tabla SELECT 'A', '2017-08-02 19:45', 500
INSERT INTO #Tabla SELECT 'A', '2017-08-02 20:45', 352
INSERT INTO #Tabla SELECT 'A', '2017-08-02 21:45', 500
INSERT INTO #Tabla SELECT 'A', '2017-08-02 23:45', 352
INSERT INTO #Tabla SELECT 'A', '2017-08-03 00:45', 352
INSERT INTO #Tabla SELECT 'A', '2017-08-03 01:45', 352

Select

select Fecha2 = CASE WHEN DATEPART(HOUR, Fecha) = 0 THEN FORMAT(DATEADD(DAY, -1, Fecha), 'yyyy-MM-dd') ELSE FORMAT(Fecha, 'yyyy-MM-dd') END, SUM(Valor) from #Tabla GROUP BY CASE WHEN DATEPART(HOUR, Fecha) = 0 THEN FORMAT(DATEADD(DAY, -1, Fecha), 'yyyy-MM-dd') ELSE FORMAT(Fecha, 'yyyy-MM-dd') END

eliminar tabla

drop table #Tabla

Espero te funcione

Answered by Salo B on December 22, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP