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.
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
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP