SQL - Curioso problema(¿sql puede hacerlo?)

 
Vista:

Curioso problema(¿sql puede hacerlo?)

Publicado por CapLurker (2 intervenciones) el 22/12/2011 10:50:28
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!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Curioso problema(¿sql puede hacerlo?)

Publicado por JOSE LUIS (4 intervenciones) el 22/12/2011 16:16:29
Aqui te muestra la solucion desde el punto de vista matematico, con respecto a los datos y conversiones dependeran de tu entidad, a modo de ejemplo solo filtre por fecha, conceptualmente seria lo mismo para cualquier tipo de busquedas que debas hacer.

DECLARE @HOY VARCHAR(10);
SET @HOY=REPLACE(CONVERT(VARCHAR(10),GETDATE(),4),'.','')-- el dia de hoy

SELECT USUARIO
FROM [_NOMBRE_T]
WHERE CAST(DATE AS INT)=CAST(@HOY AS INT)

Espero que sea de ayuda, Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Curioso problema(¿sql puede hacerlo?)

Publicado por CapLurker (2 intervenciones) el 22/12/2011 18:15:13
Mil gracias por tu rápida respuesta, Jose Luis.
En efecto, la solucion que tenemos es muy similar, diferenciandose en que no hemos convertido la fecha de numero al formato correcto.
Agradezco mucho tu aportacion, pero no filtra la hora. Se me ocurre trabajar sobre tu solucion, haciendo tambien el filtrado de los 4 campos, probando con una preseleccion y un ORDER BY...
¿alguna idea más?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Curioso problema(¿sql puede hacerlo?)

Publicado por JOSE LUIS (4 intervenciones) el 22/12/2011 19:15:35
Para la hora usando este metodo solo deberias hacer algo asi, o directamente trabajar con campos datetime, lo cual te simplificaria mucho las cosas, pero a veces nos debemos ajustar a determinados escenarios.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 6
Ha aumentado su posición en 2 puestos en SQL (en relación al último mes)
Gráfica de SQL

Curioso problema(¿sql puede hacerlo?)

Publicado por Liliana (21 intervenciones) el 06/01/2012 17:54:52
Hola,
Además de lo comentado por Jose Luis sobre la conveniencia de trabajar con datos DateTime, aporto una solución a tus datos:


select usuario, fecha,
Entra1 = max (case when hora < 090000 then hora else 0 end),
Sale1 = max (case when hora between 090000 and 150000 then hora else 0 end),
Entra2 = max (case when hora between 150000 and 159999 then hora else 0 end),
Sale2 = max (case when hora >= 160000 then hora else 0 end)
from tabla
group by usuario, fecha

Saludos,
Liliana.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar