Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Agrupar datetime por medias horas?? se puede???

Estas en el tema de Agrupar datetime por medias horas?? se puede??? en el foro de Mysql en Foros del Web. Hola un gran saludo a todos. Paso a mi consulta. Tengo una consulta que me trae datos agrupados por hora desde una campo datetime @import ...
  #1 (permalink)  
Antiguo 26/05/2009, 17:48
 
Fecha de Ingreso: abril-2008
Mensajes: 208
Antigüedad: 16 años
Puntos: 2
Agrupar datetime por medias horas?? se puede???

Hola

un gran saludo a todos.
Paso a mi consulta. Tengo una consulta que me trae datos agrupados por hora desde una campo datetime
Código Mysql:
Ver original
  1. Group By hour(fechahora)
Hasta aquí todo bien, pero ahora me pidieron sacar este reporte por cada media hora, e incluso cada 15 minutos.

Código mysql:
Ver original
  1. Group By mediahora(fechahora) ????

Alguna idea??

desde ya gracias
  #2 (permalink)  
Antiguo 26/05/2009, 18:49
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Agrupar datetime por medias horas?? se puede???

No creo que se pueda.

Pero dinos con un ejemplo, que es exactamente lo que requieres y podemos mirar una solución.

Un saludo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 26/05/2009, 19:56
 
Fecha de Ingreso: abril-2008
Mensajes: 208
Antigüedad: 16 años
Puntos: 2
Respuesta: Agrupar datetime por medias horas?? se puede???

Esta consulta me trae la suma de contactos agrupados por:
Año, mes, día, fecha, hora.

Código mysql:
Ver original
  1. Year(fecha_date2) as `año`,    
  2. WHEN MONTH(fecha_date2) = 1 THEN "enero"  
  3. WHEN MONTH(fecha_date2) = 2 THEN "febrero"
  4. WHEN MONTH(fecha_date2) = 3 THEN "marzo"  
  5. WHEN MONTH(fecha_date2) = 4 THEN "abril"  
  6. WHEN MONTH(fecha_date2) = 5 THEN "mayo"  
  7. WHEN MONTH(fecha_date2) = 6 THEN "junio"  
  8. WHEN MONTH(fecha_date2) = 7 THEN "julio"  
  9. WHEN MONTH(fecha_date2) = 8 THEN "agosto"  
  10. WHEN MONTH(fecha_date2) = 9 THEN "septiembre"  
  11. WHEN MONTH(fecha_date2) = 10 THEN "octubre"  
  12. WHEN MONTH(fecha_date2) = 11 THEN "noviembre"  
  13. WHEN MONTH(fecha_date2) = 12 THEN "diciembre"  
  14. ELSE "NUUL_MES" END)  AS MES ,    
  15.  CASE
  16.    WHEN weekday(fecha_date2) = 0 THEN "Lunes"
  17.    WHEN weekday(fecha_date2) = 1 THEN "Martes"
  18.    WHEN weekday(fecha_date2) = 2 THEN "Miercoles"
  19.    WHEN weekday(fecha_date2) = 3 THEN "Jueves"
  20.    WHEN weekday(fecha_date2) = 4 THEN "Viernes"
  21.    WHEN weekday(fecha_date2) = 5 THEN "Sabado"
  22.    WHEN weekday(fecha_date2) = 6 THEN "Domingo"
  23.    ELSE "NUUL_DIA" END AS `DIA`,
  24. date_format(fecha_date2,'%Y-%m-%d') as fecha,
  25. hour(fecha_date2) as hora,
  26. sum(if(recibido= '',0,recibido)) as Recibido
  27. From Reg_15_minutos
  28. Where fecha_date between '2009-03-01 00:00:00' and '2009-05-30 23:59:00'
  29. group by year(fecha_date2), month(fecha_date2), dayofmonth(fecha_date2), hour(fecha_date2)
  30. order by year(fecha_date2) asc, month(fecha_date2) asc, weekday(fecha_date2)asc, dayofmonth(fecha_date2) asc,hour(fecha_date2) asc



Y me regresa la siguiente tabla.
+------+-------+---------+------------+------+----------+
| año | MES | DIA | fecha | hora | Recibido |
+------+-------+---------+------------+------+----------+
| 2009 | MARZO | Domingo | 2009-03-01 | 4 | 9 |
| 2009 | MARZO | Domingo | 2009-03-01 | 5 | 9 |
| 2009 | MARZO | Domingo | 2009-03-01 | 6 | 14 |
| 2009 | MARZO | Domingo | 2009-03-01 | 7 | 7 |
+------+-------+---------+------------+------+----------+

Pero lo que necesito ahora es que me de lo recibido agrupado por año, mes, dia, fecha y cada media hora, o sea para el ejemplo:

4:00
4:30
5:00
5:30 etc


espero se entienda

Y por supúesto gracias por la ayuda

Chelodelsur
  #4 (permalink)  
Antiguo 26/05/2009, 21:36
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Agrupar datetime por medias horas?? se puede???

No se si esto te sirva..
pruebalo y nos cuentas

Código mysql:
Ver original
  1. YEAR(fecha_date2) as `año`,    
  2. WHEN MONTH(fecha_date2) = 1 THEN "enero"  
  3. WHEN MONTH(fecha_date2) = 2 THEN "febrero"
  4. WHEN MONTH(fecha_date2) = 3 THEN "marzo"  
  5. WHEN MONTH(fecha_date2) = 4 THEN "abril"  
  6. WHEN MONTH(fecha_date2) = 5 THEN "mayo"  
  7. WHEN MONTH(fecha_date2) = 6 THEN "junio"  
  8. WHEN MONTH(fecha_date2) = 7 THEN "julio"  
  9. WHEN MONTH(fecha_date2) = 8 THEN "agosto"  
  10. WHEN MONTH(fecha_date2) = 9 THEN "septiembre"  
  11. WHEN MONTH(fecha_date2) = 10 THEN "octubre"  
  12. WHEN MONTH(fecha_date2) = 11 THEN "noviembre"  
  13. WHEN MONTH(fecha_date2) = 12 THEN "diciembre"  
  14. ELSE "NUUL_MES" END)  AS MES ,    
  15.  CASE
  16.    WHEN WEEKDAY(fecha_date2) = 0 THEN "Lunes"
  17.    WHEN WEEKDAY(fecha_date2) = 1 THEN "Martes"
  18.    WHEN WEEKDAY(fecha_date2) = 2 THEN "Miercoles"
  19.    WHEN WEEKDAY(fecha_date2) = 3 THEN "Jueves"
  20.    WHEN WEEKDAY(fecha_date2) = 4 THEN "Viernes"
  21.    WHEN WEEKDAY(fecha_date2) = 5 THEN "Sabado"
  22.    WHEN WEEKDAY(fecha_date2) = 6 THEN "Domingo"
  23.    ELSE "NUUL_DIA" END AS `DIA`,
  24. DATE_FORMAT(fecha_date2,'%Y-%m-%d') as fecha,
  25. HOUR(fecha_date2) as hora,
  26. MINUTE(fecha_date2) as minuto,
  27. sum(if(recibido= '',0,recibido)) as Recibido
  28. FROM Reg_15_minutos
  29. WHERE fecha_date BETWEEN '2009-03-01 00:00:00' AND '2009-05-30 23:59:00'
  30. GROUP BY YEAR(fecha_date2), MONTH(fecha_date2), DAYOFMONTH(fecha_date2), HOUR(fecha_date2), if(minute(fecha_date2)<=30,1,0)
  31. ORDER BY YEAR(fecha_date2) asc, MONTH(fecha_date2) asc, WEEKDAY(fecha_date2)asc, DAYOFMONTH(fecha_date2) asc,HOUR(fecha_date2) asc, minute(fecha_date2) asc;

Por lo menos agrupa en dos grupos (antes de 30 min y despues de 30 min)
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 27/05/2009, 03:08
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Agrupar datetime por medias horas?? se puede???

Mira aquí, por si te sirve de algo:
http://www.forosdelweb.com/f86/agrup...inutos-595591/

y luego para mostrar la hora así
12:00
12:30
etc.
multiplicas el número que sale por 60 y lo conviertes en tiempo, o bien creas una tabla de correspondencias...

Última edición por jurena; 27/05/2009 a las 03:14
  #6 (permalink)  
Antiguo 27/05/2009, 06:23
 
Fecha de Ingreso: abril-2008
Mensajes: 208
Antigüedad: 16 años
Puntos: 2
Respuesta: Agrupar datetime por medias horas?? se puede???

MUCHAS GRACIAS a Huesos52 y a Jurena

He visto las dos propuestas y ambas me ayudan, creo que la de Juerena se acerca más a mi solución. Solo tengo que salvar algunas dificultades de mis datos, tales como que pasa cuando en un perido (30 o 15 min) no hay registros.

Muchas gracias me han ayudado un monton.

Chelodelsur
  #7 (permalink)  
Antiguo 27/05/2009, 08:06
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Agrupar datetime por medias horas?? se puede???

No tiene por qué pasar nada; si usas la solución de la tabla (con las medias horas posibles y el número de agrupación: serían dos campos) relacionada con el valor generado haces un right join desde el valor que obtienes a esa tabla, relacionado por el número de agrupación, y utilizas un ifnull() para el valor generado, haciendo que sea 0 para en el caso de ser null el campo generado por tu fecha, y ya debería estar.
  #8 (permalink)  
Antiguo 27/05/2009, 08:17
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Agrupar datetime por medias horas?? se puede???

Excelente Jurena.
Todos los días aprendo algo nuevo.
Y lo que creía imposible, es posible. jejeje
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #9 (permalink)  
Antiguo 21/07/2009, 13:59
 
Fecha de Ingreso: abril-2008
Mensajes: 208
Antigüedad: 16 años
Puntos: 2
Que estoy haciendo mal????

Hola a todos
Yo de nuevo..

He tenido que retomar este tema que se ma había quedado en el tintero, y no doy con la solución a mi problema.
El siguiente codigo me lista los datos, ya (con la ayuda de Jurena y Huesos52) he formateado las horas a periodos de media hora, pero no logro levantar las horas donde no hay registro.

Código MySQL:
Ver original
  1.       YEAR(fecha_date2) AS `año`,    
  2.       UPPER(CASE WHEN MONTH(fecha_date2) = 1 THEN "enero"  
  3.                  WHEN MONTH(fecha_date2) = 2 THEN "febrero"
  4.                  WHEN MONTH(fecha_date2) = 3 THEN "marzo"  
  5.                  WHEN MONTH(fecha_date2) = 4 THEN "abril"  
  6.                  WHEN MONTH(fecha_date2) = 5 THEN "mayo"  
  7.                  WHEN MONTH(fecha_date2) = 6 THEN "junio"  
  8.                  WHEN MONTH(fecha_date2) = 7 THEN "julio"  
  9.                  WHEN MONTH(fecha_date2) = 8 THEN "agosto"  
  10.                  WHEN MONTH(fecha_date2) = 9 THEN "septiembre"  
  11.                  WHEN MONTH(fecha_date2) = 10 THEN "octubre"  
  12.                  WHEN MONTH(fecha_date2) = 11 THEN "noviembre"  
  13.                  WHEN MONTH(fecha_date2) = 12 THEN "diciembre"  
  14.                                ELSE "NUUL_MES" END)  AS MES ,    
  15.       UPPER(CASE WHEN WEEKDAY(fecha_date2) = 0 THEN "Lunes"
  16.                  WHEN WEEKDAY(fecha_date2) = 1 THEN "Martes"
  17.                  WHEN WEEKDAY(fecha_date2) = 2 THEN "Miercoles"
  18.                  WHEN WEEKDAY(fecha_date2) = 3 THEN "Jueves"
  19.                  WHEN WEEKDAY(fecha_date2) = 4 THEN "Viernes"
  20.                  WHEN WEEKDAY(fecha_date2) = 5 THEN "Sabado"
  21.                  WHEN WEEKDAY(fecha_date2) = 6 THEN "Domingo"
  22.                                 ELSE "NUUL_DIA" END) AS `DIA`,
  23.       DATE_FORMAT(fecha_date2,'%Y-%m-%d') AS fecha,
  24.       TIME_FORMAT(fecha_date2,'%H:%i:%s') AS Horareal,
  25.        h.mediahora AS `mediahora`,  
  26.             SUM(IF(recibido= '',0,recibido)) AS Recibido
  27. FROM rrserver.Reg_15_minutos
  28. RIGHT JOIN rrserver.horas h
  29. ON  h.mediahora =  CONCAT(IF(HOUR(fecha_date2)<10,CONCAT('0',HOUR(fecha_date2)) , HOUR(fecha_date2)),':', IF(MINUTE(fecha_date2)<29,'00','30'),':','00')  
  30. WHERE fecha_date2 BETWEEN '2009-03-02 00:00:00' AND '2009-03-02 100:00'
  31. GROUP BY YEAR(fecha_date2), MONTH(fecha_date2), DAYOFMONTH(fecha_date2), `mediahora`
  32.  
  33. ORDER BY YEAR(fecha_date2) ASC, MONTH(fecha_date2) ASC, WEEKDAY(fecha_date2)ASC, DAYOFMONTH(fecha_date2) ASC, h.mediahora ASC;


Como ven este es el resultado y por ejemplo no levanta el periodo de las 03:30, o 04:30, 05:00, 05:30. por que en esos hoarios no hay registros.

Porfa denme una mano una vez más
+------+-------+-------+------------+----------+-----------+----------+
| año | MES | DIA | fecha | Horareal | mediahora | Recibido |
+------+-------+-------+------------+----------+-----------+----------+
| 2009 | MARZO | LUNES | 2009-03-02 | 00:15:00 | 00:00:00 | 2 |
| 2009 | MARZO | LUNES | 2009-03-02 | 00:45:00 | 00:30:00 | 1 |
| 2009 | MARZO | LUNES | 2009-03-02 | 01:00:00 | 01:00:00 | 3 |
| 2009 | MARZO | LUNES | 2009-03-02 | 01:30:00 | 01:30:00 | 1 |
| 2009 | MARZO | LUNES | 2009-03-02 | 02:15:00 | 02:00:00 | 1 |
| 2009 | MARZO | LUNES | 2009-03-02 | 02:30:00 | 02:30:00 | 2 |
| 2009 | MARZO | LUNES | 2009-03-02 | 03:00:00 | 03:00:00 | 2 |
| 2009 | MARZO | LUNES | 2009-03-02 | 04:15:00 | 04:00:00 | 2 |
| 2009 | MARZO | LUNES | 2009-03-02 | 06:15:00 | 06:00:00 | 3 |
| 2009 | MARZO | LUNES | 2009-03-02 | 06:30:00 | 06:30:00 | 7 |
| 2009 | MARZO | LUNES | 2009-03-02 | 07:00:00 | 07:00:00 | 24 |
| 2009 | MARZO | LUNES | 2009-03-02 | 07:30:00 | 07:30:00 | 62 |
| 2009 | MARZO | LUNES | 2009-03-02 | 08:00:00 | 08:00:00 | 101 |
| 2009 | MARZO | LUNES | 2009-03-02 | 08:30:00 | 08:30:00 | 98 |
| 2009 | MARZO | LUNES | 2009-03-02 | 09:00:00 | 09:00:00 | 142 |
| 2009 | MARZO | LUNES | 2009-03-02 | 09:30:00 | 09:30:00 | 122 |
| 2009 | MARZO | LUNES | 2009-03-02 | 10:00:00 | 10:00:00 | 85 |
+------+-------+-------+------------+----------+-----------+----------+


desde ya gracias
  #10 (permalink)  
Antiguo 21/07/2009, 14:32
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Agrupar datetime por medias horas?? se puede???

No recuerdo muy bien este tema
Pero acomodandome un poco al ultimo post propuesto por jurena, podrías probar algo así:

Código sql:
Ver original
  1. TIME_FORMAT(fecha_date2,'%H:%i:%s') AS Horareal,
  2.        ifnull(h.mediahora,0) AS `mediahora`,  
  3.             SUM(IF(recibido= '',0,recibido)) AS Recibido
  4. FROM rrserver.Reg_15_minutos

Si no es lo que requieres, te agradecería postearas las sentencias create table de reg_15_minutos y horas. Ademas, unos cuantos inserts para poder hacer pruebas.

Un saludo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #11 (permalink)  
Antiguo 22/07/2009, 06:38
 
Fecha de Ingreso: abril-2008
Mensajes: 208
Antigüedad: 16 años
Puntos: 2
Respuesta: Agrupar datetime por medias horas?? se puede???

Gracias por el interes Huesos52

Mira tu codigo no soluciona mi tema, lo que pasa es que en la tabla reg_15_minutos, se guardan los contactos entrantes, la aplicación hace un Insert en la tabla cada 15 minutos, pero por un tema de diseño de la aplicación, para ahorrar espacio de disco, cuando en un periodo de tiempo no hay registros, la aplicación NO hace el insert, por lo que al consultar los datos, solo levanta los horarios en los que se registraron contactos. Bien necesito hacer una curva de trafico de esos datos, pero necesito graficar todas las horas del día, y para las horas en las que no hay registro colocar un valor 0 (cero).
Hice otra tabla con las horas del día, en intervalos de media hora, e intento hacer un cruce, para que me liste todas las horas del dia, pero no logro hacerlo. De momento el codigo que tengo hace correctamente el cruce de las dos tablas, pero no levanta los horarios de la tabla horas en los que no hay registros en la tabla Reg_15_minutos.

Código MySQL:
Ver original
  1. CREATE TABLE `reg_15_minutos` (
  2.   `NOMBRE_SITIO` VARCHAR(10) DEFAULT NULL,
  3.   `Fecha_date2` DATETIME DEFAULT NULL,
  4.   `RECIBIDO` DECIMAL(10,0) DEFAULT NULL,

Ejemplo de datos de esta tabla
Código MYSQL:
Ver original
  1. insert into `reg_15_minutos` (`nombre_sitio`, `fecha_date2`, `recibido`) values('PRUEBA','2009-03-02 00:15:00','2');
  2. insert into `reg_15_minutos` (`nombre_sitio`, `fecha_date2`, `recibido`) values('PRUEBA','2009-03-02 01:00:00','1');
  3. insert into `reg_15_minutos` (`nombre_sitio`, `fecha_date2`, `recibido`) values('PRUEBA','2009-03-02 02:15:00','1');
  4. insert into `reg_15_minutos` (`nombre_sitio`, `fecha_date2`, `recibido`) values('PRUEBA','2009-03-02 03:00:00','1');
  5. insert into `reg_15_minutos` (`nombre_sitio`, `fecha_date2`, `recibido`) values('PRUEBA','2009-03-02 04:15:00','1');
  6. insert into `reg_15_minutos` (`nombre_sitio`, `fecha_date2`, `recibido`) values('PRUEBA','2009-03-02 06:15:00','2');
  7. insert into `reg_15_minutos` (`nombre_sitio`, `fecha_date2`, `recibido`) values('PRUEBA','2009-03-02 07:00:00','8');
  8. insert into `reg_15_minutos` (`nombre_sitio`, `fecha_date2`, `recibido`) values('PRUEBA','2009-03-02 08:00:00','5');


Código MySQL:
Ver original
  1. CREATE TABLE `horas` (
  2.   `mediahora` TIME NOT NULL DEFAULT '00:00:00',
  3.   `orden` VARCHAR(4) DEFAULT NULL
  4. ) ENGINE=MYISAM DEFAULT CHARSET=latin1

Datos de la tabla Horas, la columna orden esra un idea para relacionarlos con los horas, pero no cumple otra funcion.
Código MySQL:
Ver original
  1. insert into `horas` (`mediahora`, `orden`) values('00:00:00','1 ');
  2. insert into `horas` (`mediahora`, `orden`) values('00:30:00','2 ');
  3. insert into `horas` (`mediahora`, `orden`) values('01:00:00','3 ');
  4. insert into `horas` (`mediahora`, `orden`) values('01:30:00','4 ');
  5. insert into `horas` (`mediahora`, `orden`) values('02:00:00','5 ');
  6. insert into `horas` (`mediahora`, `orden`) values('02:30:00','6 ');
  7. insert into `horas` (`mediahora`, `orden`) values('03:00:00','7 ');
  8. insert into `horas` (`mediahora`, `orden`) values('03:30:00','8 ');
  9. insert into `horas` (`mediahora`, `orden`) values('04:00:00','9 ');
  10. insert into `horas` (`mediahora`, `orden`) values('04:30:00','10 ');
  11. insert into `horas` (`mediahora`, `orden`) values('05:00:00','11 ');
  12. insert into `horas` (`mediahora`, `orden`) values('05:30:00','12 ');
  13. insert into `horas` (`mediahora`, `orden`) values('06:00:00','13 ');
  14. insert into `horas` (`mediahora`, `orden`) values('06:30:00','14 ');
  15. insert into `horas` (`mediahora`, `orden`) values('07:00:00','15 ');
  16. insert into `horas` (`mediahora`, `orden`) values('07:30:00','16 ');
  17. insert into `horas` (`mediahora`, `orden`) values('08:00:00','17 ');

Bien perdonen lo extenso del post, desde ya gracias por la ayuda.

Chelodelsur
  #12 (permalink)  
Antiguo 22/07/2009, 08:00
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Agrupar datetime por medias horas?? se puede???

chelodelsur..

Vaya si fue dificil encontrar el por que no respetaba el left o right join al momento de hacer la consulta.
Todo se da por la condición que se maneja en el where. Desde ahí, estamos limitando toda una consulta con referencia a el campo fecha_date2 y no teniendo en cuenta a mediahora de la tabla horas.

Código mysql:
Ver original
  1.       ifnull(YEAR(fecha_date2),"SIN REGISTROS") AS `año`,    
  2.       UPPER(CASE WHEN MONTH(fecha_date2) = 1 THEN "enero"  
  3.                  WHEN MONTH(fecha_date2) = 2 THEN "febrero"
  4.                  WHEN MONTH(fecha_date2) = 3 THEN "marzo"  
  5.                  WHEN MONTH(fecha_date2) = 4 THEN "abril"  
  6.                  WHEN MONTH(fecha_date2) = 5 THEN "mayo"  
  7.                  WHEN MONTH(fecha_date2) = 6 THEN "junio"  
  8.                  WHEN MONTH(fecha_date2) = 7 THEN "julio"  
  9.                  WHEN MONTH(fecha_date2) = 8 THEN "agosto"  
  10.                  WHEN MONTH(fecha_date2) = 9 THEN "septiembre"  
  11.                  WHEN MONTH(fecha_date2) = 10 THEN "octubre"  
  12.                  WHEN MONTH(fecha_date2) = 11 THEN "noviembre"  
  13.                  WHEN MONTH(fecha_date2) = 12 THEN "diciembre"  
  14.                                ELSE "Sin registros" END)  AS MES ,    
  15.       UPPER(CASE WHEN WEEKDAY(fecha_date2) = 0 THEN "Lunes"
  16.                  WHEN WEEKDAY(fecha_date2) = 1 THEN "Martes"
  17.                  WHEN WEEKDAY(fecha_date2) = 2 THEN "Miercoles"
  18.                  WHEN WEEKDAY(fecha_date2) = 3 THEN "Jueves"
  19.                  WHEN WEEKDAY(fecha_date2) = 4 THEN "Viernes"
  20.                  WHEN WEEKDAY(fecha_date2) = 5 THEN "Sabado"
  21.                  WHEN WEEKDAY(fecha_date2) = 6 THEN "Domingo"
  22.                                 ELSE "Sin registros" END) AS `DIA`,
  23.       ifnull(DATE_FORMAT(fecha_date2,'%Y-%m-%d'),"SIN REGISTROS") AS fecha,
  24.       ifnull(TIME_FORMAT(fecha_date2,'%H:%i:%s'),"SIN REGISTROS") AS Horareal,
  25.       h.mediahora AS `mediahora`,  
  26.       ifnull(SUM(IF(recibido= '',0,recibido)),"SIN REGISTROS") AS Recibido
  27. FROM Reg_15_minutos
  28. RIGHT JOIN horas h
  29. ON  h.mediahora =  CONCAT(IF(HOUR(fecha_date2)<10,CONCAT('0',HOUR(fecha_date2)) , HOUR(fecha_date2)),':', IF(MINUTE(fecha_date2)<29,'00','30'),':','00')  
  30. WHERE (fecha_date2 BETWEEN '2009-03-02 00:00:00' AND '2009-03-02 09:00:00') OR (h.mediahora between time('2009-03-02 00:00:00') and time('2009-03-02 09:00:00'))
  31. GROUP BY YEAR(fecha_date2), MONTH(fecha_date2), DAYOFMONTH(fecha_date2), `mediahora`
  32. ORDER BY YEAR(fecha_date2) ASC, MONTH(fecha_date2) ASC, WEEKDAY(fecha_date2)ASC, DAYOFMONTH(fecha_date2) ASC, h.mediahora ASC;

He probado esto y parece funcionar. Pruebalo y nos cuentas.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #13 (permalink)  
Antiguo 22/07/2009, 08:45
 
Fecha de Ingreso: abril-2008
Mensajes: 208
Antigüedad: 16 años
Puntos: 2
Respuesta: Agrupar datetime por medias horas?? se puede???

no funciona

Solo levanta las horas en las que hay datos. si te fijas por ejemplo levanta a las:

00:00 = 2,
no levanta las 00:30= 0,
01:00 = 1,

MM esta complicado
  #14 (permalink)  
Antiguo 22/07/2009, 08:52
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Agrupar datetime por medias horas?? se puede???

No te entiendo chelo del sur.
Mira esto:

Código mysql:
Ver original
  1. mysql> SELECT
  2.     ->       ifnull(YEAR(fecha_date2),"SIN REGISTROS") AS `año`,
  3.     ->       UPPER(CASE WHEN MONTH(fecha_date2) = 1 THEN "enero"
  4.     ->                  WHEN MONTH(fecha_date2) = 2 THEN "febrero"
  5.     ->                  WHEN MONTH(fecha_date2) = 3 THEN "marzo"
  6.     ->                  WHEN MONTH(fecha_date2) = 4 THEN "abril"
  7.     ->                  WHEN MONTH(fecha_date2) = 5 THEN "mayo"
  8.     ->                  WHEN MONTH(fecha_date2) = 6 THEN "junio"
  9.     ->                  WHEN MONTH(fecha_date2) = 7 THEN "julio"
  10.     ->                  WHEN MONTH(fecha_date2) = 8 THEN "agosto"
  11.     ->                  WHEN MONTH(fecha_date2) = 9 THEN "septiembre"
  12.     ->                  WHEN MONTH(fecha_date2) = 10 THEN "octubre"
  13.     ->                  WHEN MONTH(fecha_date2) = 11 THEN "noviembre"
  14.     ->                  WHEN MONTH(fecha_date2) = 12 THEN "diciembre"
  15.     ->                                ELSE "Sin registros" END)  AS MES ,
  16.     ->       UPPER(CASE WHEN WEEKDAY(fecha_date2) = 0 THEN "Lunes"
  17.     ->                  WHEN WEEKDAY(fecha_date2) = 1 THEN "Martes"
  18.     ->                  WHEN WEEKDAY(fecha_date2) = 2 THEN "Miercoles"
  19.     ->                  WHEN WEEKDAY(fecha_date2) = 3 THEN "Jueves"
  20.     ->                  WHEN WEEKDAY(fecha_date2) = 4 THEN "Viernes"
  21.     ->                  WHEN WEEKDAY(fecha_date2) = 5 THEN "Sabado"
  22.     ->                  WHEN WEEKDAY(fecha_date2) = 6 THEN "Domingo"
  23.     ->                                 ELSE "Sin registros" END) AS `DIA`,
  24.     ->       ifnull(DATE_FORMAT(fecha_date2,'%Y-%m-%d'),"SIN REGISTROS") AS fecha,
  25.     ->       ifnull(TIME_FORMAT(fecha_date2,'%H:%i:%s'),"SIN REGISTROS") AS Horareal,
  26.     ->       h.mediahora AS `mediahora`,
  27.     ->       ifnull(SUM(IF(recibido= '',0,recibido)),0) AS Recibido
  28.     -> FROM Reg_15_minutos
  29.     -> RIGHT JOIN horas h
  30.     -> ON  h.mediahora =  CONCAT(IF(HOUR(fecha_date2)<10,CONCAT('0',HOUR(fecha_date2)) , HOUR(fecha_date2)),':', IF(MINUTE(fecha_date2)<29,'00','30'),':','00')
  31.     -> WHERE (fecha_date2 BETWEEN '2009-03-02 00:00:00' AND '2009-03-02 09:00:00') OR (h.mediahora between time('2009-03-02 00:00:00') and time('2009-03-02 09:00:00'))
  32.     -> GROUP BY YEAR(fecha_date2), MONTH(fecha_date2), DAYOFMONTH(fecha_date2), `mediahora`
  33.     -> ORDER BY h.mediahora,fecha_date2;
  34. +---------------+---------------+---------------+---------------+---------------+-----------+----------+
  35. | a&#241;o           | MES           | DIA           | fecha         | Horareal      | mediahora | Recibido |
  36. +---------------+---------------+---------------+---------------+---------------+-----------+----------+
  37. | 2009          | MARZO         | LUNES         | 2009-03-02    | 00:15:00      | 00:00:00  |        5 |
  38. | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | 00:30:00  |        0 |
  39. | 2009          | MARZO         | LUNES         | 2009-03-02    | 01:00:00      | 01:00:00  |        1 |
  40. | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | 01:30:00  |        0 |
  41. | 2009          | MARZO         | LUNES         | 2009-03-02    | 02:15:00      | 02:00:00  |        1 |
  42. | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | 02:30:00  |        0 |
  43. | 2009          | MARZO         | LUNES         | 2009-03-02    | 03:00:00      | 03:00:00  |        1 |
  44. | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | 03:30:00  |        0 |
  45. | 2009          | MARZO         | LUNES         | 2009-03-02    | 04:15:00      | 04:00:00  |        1 |
  46. | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | 04:30:00  |        0 |
  47. | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | 05:00:00  |        0 |
  48. | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | 05:30:00  |        0 |
  49. | 2009          | MARZO         | LUNES         | 2009-03-02    | 06:15:00      | 06:00:00  |        2 |
  50. | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | 06:30:00  |        0 |
  51. | 2009          | MARZO         | LUNES         | 2009-03-02    | 07:00:00      | 07:00:00  |        8 |
  52. | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | 07:30:00  |        0 |
  53. | 2009          | MARZO         | LUNES         | 2009-03-02    | 08:00:00      | 08:00:00  |        5 |
  54. +---------------+---------------+---------------+---------------+---------------+-----------+----------+
  55. 17 rows in set (0.00 sec)
  56.  
  57. mysql>

Muestra todas las horas presentes en la tabla horas y dice si hay o no registros. Realmente, que salida esperarías?
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #15 (permalink)  
Antiguo 22/07/2009, 12:47
 
Fecha de Ingreso: abril-2008
Mensajes: 208
Antigüedad: 16 años
Puntos: 2
Respuesta: Agrupar datetime por medias horas?? se puede???

Gracias Huesos52 por tu ayuda.

Claro ahor probe la consulta con los datos de prueba que te envié, y efectivamente funciona mas o menos como necesito.

+---------------+---------------+---------------+---------------+---------------+-----------+---------------+
| año | MES | DIA | fecha | Horareal | mediahora | Recibido |
+---------------+---------------+---------------+---------------+---------------+-----------+---------------+
| SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | 00:30:00 | SIN REGISTROS |
| SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | 01:30:00 | SIN REGISTROS |
| SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | 02:30:00 | SIN REGISTROS |
| SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | 03:30:00 | SIN REGISTROS |
| SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | 04:30:00 | SIN REGISTROS |
| SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | 05:00:00 | SIN REGISTROS |
| SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | 05:30:00 | SIN REGISTROS |
| SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | 06:30:00 | SIN REGISTROS |
| SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | 07:30:00 | SIN REGISTROS |
| SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | 08:30:00 | SIN REGISTROS |
| SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | SIN REGISTROS | 09:00:00 | SIN REGISTROS |
| 2009 | MARZO | LUNES | 2009-03-02 | 00:15:00 | 00:00:00 | 2 |
| 2009 | MARZO | LUNES | 2009-03-02 | 01:00:00 | 01:00:00 | 1 |
| 2009 | MARZO | LUNES | 2009-03-02 | 02:15:00 | 02:00:00 | 1 |
| 2009 | MARZO | LUNES | 2009-03-02 | 03:00:00 | 03:00:00 | 1 |
| 2009 | MARZO | LUNES | 2009-03-02 | 04:15:00 | 04:00:00 | 1 |
| 2009 | MARZO | LUNES | 2009-03-02 | 06:15:00 | 06:00:00 | 2 |
| 2009 | MARZO | LUNES | 2009-03-02 | 07:00:00 | 07:00:00 | 8 |
| 2009 | MARZO | LUNES | 2009-03-02 | 08:00:00 | 08:00:00 | 5 |
+---------------+---------------+---------------+---------------+---------------+-----------+---------------+

Pero al hacer la consulta con la tabla con todos los datos, ya no trabaja bien . Me parece que en la tabla de prueba lo hace por que hay datos de algunas horas de UN SOLO día, pero el la realidad la tabla tiene datos de varios meses, por lo que por ejemplo el día 03 no tiene registros a las 04 am, pero el 4 si,

En fin , estoy viendo otra manera, pero no me termina de convencer.

Huesos52 , agradesco sinceramente tu colaboración , luego posteo el otro codigo para tu opinión y contribución

Gracias.

Última edición por chelodelsur; 22/07/2009 a las 13:15
  #16 (permalink)  
Antiguo 22/07/2009, 13:13
 
Fecha de Ingreso: abril-2008
Mensajes: 208
Antigüedad: 16 años
Puntos: 2
Respuesta: Agrupar datetime por medias horas?? se puede???

Huesos52:

Mira esta es la consulta nueva, (por decirlo, ya que es la misma anterior repetida dos veces, con algunos ajustes)

Código MySql:
Ver original
  1. SELECT año,mes,dia,fecha,mediahora,SUM(Recibido)
  2. (
  3.       YEAR(k.fecha_date2) AS año,    
  4.       UPPER(CASE WHEN MONTH(k.fecha_date2) = 1 THEN "enero"  
  5.                  WHEN MONTH(k.fecha_date2) = 2 THEN "febrero"
  6.                  WHEN MONTH(k.fecha_date2) = 3 THEN "marzo"  
  7.                  WHEN MONTH(k.fecha_date2) = 4 THEN "abril"  
  8.                  WHEN MONTH(k.fecha_date2) = 5 THEN "mayo"  
  9.                  WHEN MONTH(k.fecha_date2) = 6 THEN "junio"  
  10.                  WHEN MONTH(k.fecha_date2) = 7 THEN "julio"  
  11.                  WHEN MONTH(k.fecha_date2) = 8 THEN "agosto"  
  12.                  WHEN MONTH(k.fecha_date2) = 9 THEN "septiembre"  
  13.                  WHEN MONTH(k.fecha_date2) = 10 THEN "octubre"  
  14.                  WHEN MONTH(k.fecha_date2) = 11 THEN "noviembre"  
  15.                  WHEN MONTH(k.fecha_date2) = 12 THEN "diciembre"  
  16.                                ELSE "NUUL_MES" END)  AS MES ,    
  17.       UPPER(CASE WHEN WEEKDAY(k.fecha_date2) = 0 THEN "Lunes"
  18.                  WHEN WEEKDAY(k.fecha_date2) = 1 THEN "Martes"
  19.                  WHEN WEEKDAY(k.fecha_date2) = 2 THEN "Miercoles"
  20.                  WHEN WEEKDAY(k.fecha_date2) = 3 THEN "Jueves"
  21.                  WHEN WEEKDAY(k.fecha_date2) = 4 THEN "Viernes"
  22.                  WHEN WEEKDAY(k.fecha_date2) = 5 THEN "Sabado"
  23.                  WHEN WEEKDAY(k.fecha_date2) = 6 THEN "Domingo"
  24.                                 ELSE "NUUL_DIA" END) AS `DIA`,
  25.       DATE_FORMAT(k.fecha_date2,'%Y-%m-%d') AS fecha,
  26.       TIME_FORMAT(k.fecha_date2,'%H:%i:%s') AS Horareal,
  27.        j.mediahora AS mediahora,  
  28.             0 AS Recibido
  29. FROM rrserver.horas j,
  30. rrserver.reg_15_minutos k
  31. WHERE k.fecha_date2 BETWEEN '2009-03-02 00:00:00' AND '2009-07-19 23:59'
  32.  
  33.  
  34.       YEAR(t.fecha_date2) AS año,    
  35.       UPPER(CASE WHEN MONTH(t.fecha_date2) = 1 THEN "enero"  
  36.                  WHEN MONTH(t.fecha_date2) = 2 THEN "febrero"
  37.                  WHEN MONTH(t.fecha_date2) = 3 THEN "marzo"  
  38.                  WHEN MONTH(t.fecha_date2) = 4 THEN "abril"  
  39.                  WHEN MONTH(t.fecha_date2) = 5 THEN "mayo"  
  40.                  WHEN MONTH(t.fecha_date2) = 6 THEN "junio"  
  41.                  WHEN MONTH(t.fecha_date2) = 7 THEN "julio"  
  42.                  WHEN MONTH(t.fecha_date2) = 8 THEN "agosto"  
  43.                  WHEN MONTH(t.fecha_date2) = 9 THEN "septiembre"  
  44.                  WHEN MONTH(t.fecha_date2) = 10 THEN "octubre"  
  45.                  WHEN MONTH(t.fecha_date2) = 11 THEN "noviembre"  
  46.                  WHEN MONTH(t.fecha_date2) = 12 THEN "diciembre"  
  47.                                ELSE "NUUL_MES" END)  AS MES ,    
  48.       UPPER(CASE WHEN WEEKDAY(t.fecha_date2) = 0 THEN "Lunes"
  49.                  WHEN WEEKDAY(t.fecha_date2) = 1 THEN "Martes"
  50.                  WHEN WEEKDAY(t.fecha_date2) = 2 THEN "Miercoles"
  51.                  WHEN WEEKDAY(t.fecha_date2) = 3 THEN "Jueves"
  52.                  WHEN WEEKDAY(t.fecha_date2) = 4 THEN "Viernes"
  53.                  WHEN WEEKDAY(t.fecha_date2) = 5 THEN "Sabado"
  54.                  WHEN WEEKDAY(t.fecha_date2) = 6 THEN "Domingo"
  55.                                 ELSE "NUUL_DIA" END) AS `DIA`,
  56.       DATE_FORMAT(t.fecha_date2,'%Y-%m-%d') AS fecha,
  57.       TIME_FORMAT(t.fecha_date2,'%H:%i:%s') AS Horareal,
  58.        h.mediahora AS mediahora,  
  59.             (IF(t.recibido= '',0,t.recibido)) AS Recibido
  60. FROM rrserver.reg_15_minutos t
  61. LEFT JOIN rrserver.horas h
  62. ON CONCAT(IF(HOUR(t.fecha_date2)<10,CONCAT('0',HOUR(t.fecha_date2)) , HOUR(t.fecha_date2)),':', IF(MINUTE(t.fecha_date2)<29,'00','30'),':','00') =  h.mediahora
  63. WHERE t.fecha_date2 BETWEEN '2009-03-02 00:00:00' AND '2009-07-19 23:59'
  64. ) a
  65. GROUP BY año,mes,dia,fecha,mediahora;

Hago una consulta que en el From tiene dos consultas unidas por UNION ALL, La primera me trae todas las horas de la tabla horas, luego con la segunda consulta sumo los registros de recibidos en la tabla reg_15_min. Con UNION ALL junto las consultas y me entrega los datos como los necesito.
Ventajas: hace el trabajo,
Desventajas: es lenta (no em complica mucho eso), es suceptible a errores de ingreso al ser tan largo el codigo, no me deja ordenar en el "sentido" de fecha de los campos del select principal, ya que los ordena en base a texto, ya que son los alias de las consultas anidadas. No se ve muy elegante, jajjaj ...
Pero funciona, por lo menos hasta el momento me parece que hace todo lo que necesito.

Código:
+------+-------+-------+------------+-----------+---------------+
| año | mes   | dia   | fecha      | mediahora | SUM(Recibido) |
+------+-------+-------+------------+-----------+---------------+
| 2009 | MARZO | LUNES | 2009-03-02 | 00:00:00  |             2 |
| 2009 | MARZO | LUNES | 2009-03-02 | 00:30:00  |             1 |
| 2009 | MARZO | LUNES | 2009-03-02 | 01:00:00  |             3 |
| 2009 | MARZO | LUNES | 2009-03-02 | 01:30:00  |             1 |
| 2009 | MARZO | LUNES | 2009-03-02 | 02:00:00  |             1 |
| 2009 | MARZO | LUNES | 2009-03-02 | 02:30:00  |             2 |
| 2009 | MARZO | LUNES | 2009-03-02 | 03:00:00  |             2 |
| 2009 | MARZO | LUNES | 2009-03-02 | 03:30:00  |             0 |
| 2009 | MARZO | LUNES | 2009-03-02 | 04:00:00  |             2 |
| 2009 | MARZO | LUNES | 2009-03-02 | 04:30:00  |             0 |
| 2009 | MARZO | LUNES | 2009-03-02 | 05:00:00  |             0 |
| 2009 | MARZO | LUNES | 2009-03-02 | 05:30:00  |             0 |
| 2009 | MARZO | LUNES | 2009-03-02 | 06:00:00  |             3 |
| 2009 | MARZO | LUNES | 2009-03-02 | 06:30:00  |             7 |
| 2009 | MARZO | LUNES | 2009-03-02 | 07:00:00  |            24 |
| 2009 | MARZO | LUNES | 2009-03-02 | 07:30:00  |            62 |
| 2009 | MARZO | LUNES | 2009-03-02 | 08:00:00  |            49 |
| 2009 | MARZO | LUNES | 2009-03-02 | 08:30:00  |             0 |
| 2009 | MARZO | LUNES | 2009-03-02 | 09:00:00  |             0 |

Una vez más muchas gracias, y por supuesto si tienes sugerencias para mejorarla, por favor no dudes en decirlo.

Saludos
  #17 (permalink)  
Antiguo 22/07/2009, 13:22
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Agrupar datetime por medias horas?? se puede???

Tu debes entender muy bien tu problema y me alegra que hayas encontrado una solución.

Te recomiendo almacenar esta consulta en una vista para ser fácilmente manipulada.

Un saludo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:40.