Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: CapLurker en 22 Diciembre 2011, 10:45 am



Título: Curioso problema (¿SQL puede hacerlo?)
Publicado por: CapLurker en 22 Diciembre 2011, 10:45 am
Wenas, soy nuevo en el foro.
Veréis, el otro día en la universidad se planteó una pregunta entre los compañeros,y ni el profesor de bbdd ha sido capaz de saber cómo se hace (pero el caso es que sí que se debería poder).
Se para confirmar asistencias de una serie de usuarios por ejemplo para una empresa, como una maquina de picar.
Presentamos una sola tabla con tuplas de 3 campos: Usuario, date, time. No hay un campo Key.
Formato: (0001,110101,800256), Correspondiente a id usuario, otro a la fecha de hoy, formato aammdd , y tiempo de ingreso, hhmmss.
Ejemplo de tabla:
[0001,110101,080256]
[0002,110101,080300]
[0001,110101,140200]
[0002,110101,140351]
[0001,110101,153612]
[0002,110101,153123]
[0001,110101,171215]
[0002,110101,171121]
Correspondería esto al primer día de trabajo, con dos trabajadores, que entran por la mañana, salen a  comer, vuelven de comer y se van por la tarde.
El caso es que la consulta que se desea realizar es la siguiente:
Para un sólo día, se pretende conseguir una tupla que contenga los siguientes campos:
[date,usuario,hora de entrada por la mañana(<9h), hora de salida por la mañana(>9h y <=15h), hora de entrada por la tarde(>=15h y <16h), hora de salida por la tarde>=16h]
El resultado sería, para la tabla anterior, dos tuplas con los dos usuarios, con fecha del 110101, y sus distintas horas de picar.
Nadie sabe si se puede hacer un UNIQUE date con JOINs a la misma tabla aplicando los filtros de la hora.
¿Alguna idea?
Salu2!


Título: Re: Curioso problema (¿SQL puede hacerlo?)
Publicado por: seba123neo en 22 Diciembre 2011, 16:22 pm
una opcion es ir interpretando el string en partes y verificar, nada mas, por ejemplo usando left, right, lo que sea...vas extrayendo los 2 primeros digitos y vas comparando si eso es mayor a lo que vos queres. tambein creo que en sql podes convertir ese numero (110101) a un formato de fecha que puedas manejar facilmente.

Convert an Integer Date to a Smalldatetime (http://blog.boxedbits.com/archives/5)

saludos.


Título: Re: Curioso problema (¿SQL puede hacerlo?)
Publicado por: CapLurker en 23 Diciembre 2011, 08:31 am
Vamos a probar lo siguente, convirtiendo el time y el date en sus formatos:

SELECT
    h.fecha,
    h.usuario,
    min(hem.hora) AS 'entrada mañana',
    max(hsm.hora) AS 'salida mañana',
    min(het.hora) AS 'entrada tarde',
    max(hst.hora) AS 'salida tarde'
FROM horario h
    LEFT JOIN horario hem ON h.usuario = hem.usuario AND hem.hora < time('09:00:00')
    LEFT JOIN horario hsm ON h.usuario = hsm.usuario AND hsm.hora BETWEEN time('09:00:01') AND time('15:00:00')
    LEFT JOIN horario het ON h.usuario = het.usuario AND het.hora BETWEEN time('15:00:01') AND time('16:00:00')
    LEFT JOIN horario hst ON h.usuario = hst.usuario AND hst.hora > time('16:00:01')
WHERE h.fecha = date('2011-01-01')
GROUP BY h.usuario, h.fecha;


Un saludo.