Ver Mensaje Individual
  #4 (permalink)  
Antiguo 04/07/2014, 10:00
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
Respuesta: Seleccionar rango de fechas de a 1 minuto

Cita:
Contra la otra tabla

Código MySQL:
Ver original
...WHERE campo BETWEEN '2014-07-04 12:00:00' AND '2014-07-04 12:10:00';


No te sirve?
Hola @quimfv gracias por responder pero no, no me sirve, necesito todos los minutos entre dos fechas como tabla para luego hacer el producto carteciano contra otra tabla.

@gnzsoloyo Gracias por la respuesta pero temo que tampoco me sirve, no estaba seguro de que con sql se pudiera, lo que habia pensado es crear una tabla con 1440 times y selecionar el concat de la fecha con el time asi solo tengo 1440 registros sino cada vez que varia la fecha tengo que repoblar la tabla y no tiene sentido.


Les explico cual es mi problema a resolver a ver si se les ocurre una forma de resolverlo diferente:

Tengo una tabla llamada agenda, que tiene estos campos:

id | hs_inicio (datetime) | hs_fin (datetime) | descripcion...

cada tarea en la agenda es un registro en esa tabla, lo que yo quiero saber, es entre dos fechas, que rangos de tiempos tengo libres tengo, esta es la consulta que uso ahora para saber que rangos tengo libres en el dia:

Código MySQL:
Ver original
  1. SET @dia = '2014-07-04';
  2.     SET @minFecha = CONCAT(@dia, ' 00:00:00');
  3.     SET @maxFecha = CONCAT(@dia, ' 23:59:00');
  4.     SET @inicio = @minFecha;
  5.     SET @fin = @maxFecha;
  6.     SET @inicioSig = @minFecha;
  7.     SET @lastId = 0;
  8.     SET @mostrar = FALSE;
  9.     SET @resto = 0;
  10.         DATE_FORMAT(IF(mostrar, inicio, resto_inicio), '%d/%m/%Y %H:%i:%s') AS inicio,
  11.         DATE_FORMAT(IF(mostrar, fin, resto_fin), '%d/%m/%Y %H:%i:%s') AS fin,
  12.         DATE_FORMAT(IF(mostrar, inicio, resto_inicio), '%Y-%m-%d %H:%i:%s') AS raw_inicio,
  13.         DATE_FORMAT(IF(mostrar, fin, resto_fin), '%Y-%m-%d %H:%i:%s') AS raw_fin,
  14.         TIMESTAMPDIFF(MINUTE, IF(mostrar, inicio, resto_inicio), IF(mostrar, fin, resto_fin)) AS minutos
  15.     FROM
  16.     (SELECT
  17.         IF(agd2.id = @lastId, (@mostrar:=TRUE), (@mostrar:=FALSE)) AS mostrar,
  18.         IF(@mostrar, 0, (@lastId:=agd2.id)) AS tmp1,
  19.         IF(@mostrar, @inicio,
  20.             IF
  21.             (agd2.`hs_inicio` > @inicio,
  22.                 IF((@fin:=agd2.`hs_inicio`) AND (@inicioSig:=agd2.`hs_fin`), TRUE, FALSE)
  23.             ,
  24.                 IF((@inicio:=agd2.`hs_fin`) AND (@fin:=agd2.`hs_fin`) AND (@inicioSig:=agd2.`hs_fin`), TRUE, FALSE)
  25.             )
  26.        
  27.         ) AS inicio,
  28.         @fin AS fin,
  29.         IF(@mostrar, (@inicio:=@inicioSig), @inicioSig) AS resto_inicio,
  30.         IF(@mostrar, (@fin:=@maxFecha), @maxFecha) AS resto_fin,
  31.         IF(@mostrar, -1, (@resto:=@resto+1)) AS resto_nro
  32.     FROM
  33.         `agenda` agd
  34.         JOIN  `agenda` AS agd2 -- Producto cartesiano
  35.     WHERE        
  36.         (
  37.                 (DATE_FORMAT(agd.`hs_inicio`, '%Y-%m-%d') = @dia)
  38.             OR  (DATE_FORMAT(agd.`hs_fin`, '%Y-%m-%d') = @dia)
  39.         )
  40.         AND
  41.         (
  42.                 (DATE_FORMAT(agd2.`hs_inicio`, '%Y-%m-%d') = @dia)
  43.             OR  (DATE_FORMAT(agd2.`hs_fin`, '%Y-%m-%d') = @dia)
  44.         )
  45.     ORDER BY
  46.         agd2.`hs_inicio`
  47.     )
  48.     AS tTemp
  49.     WHERE
  50.     (
  51.             tTemp.mostrar = 1
  52.         OR  tTemp.resto_nro = @resto
  53.     )
  54.     AND
  55.         inicio != fin
  56.     ORDER BY inicio ASC

Pero tiene varios problemas, por ejemplo, si una tarea empieza a la misma hora exacta que termina otra genera registros basura.

Si una tarea esta superpuesta con otra, genera cualquier cosa.

Solo funciona bien si las tareas estan separadas entre si y no superpuestas, lo cual no siempre es el caso.

Actualmente lo parcheo con programacion (se que es off-topic pero lo posteo para que vean que es lo que le corrijo para que ande bien)
Cita:
Editado: Código de programación no permitido en Foros de Bases de Dtos. Leer las normas del foro, por favor.
Se me ocurrio que si en otra tabla tengo todos los minutos del dia, luego podria hacer un join contra las tareas existentes para que solo me queden los minutos libres, y luego, volver a hacer un join contra si misma para buscar los rangos de minutos correlativos, pero nose si hay otra solucion
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Última edición por gnzsoloyo; 04/07/2014 a las 10:14