none
seleccionar id excepto los que están fuera de un rango de hora RRS feed

  • Pregunta

  • hola a todo de nuevo.

    mi pregunto es seleccionar ciertos id  excepto los que su hora de entrada pasen de los siguientes rangos

    07:01-7:20,  08:01-08:20, 09:01-09:20, 10:01- 10:20

    para mostrar estos id  con esta referencia  de horas realizo el siguiente query

    select nomina,nombre,fecha,hora  from filtro where ((hora>= '07:01' and hora<='07:20') or (hora>='08:01' and hora<='08:20') or (hora>='09:01' and hora<='09:20') or (hora>='10:01' and hora<='10:20'))  and fecha between @inicio and @fin order by fecha

    como puedo solo mostrar una sola vez el id que no tenga una llegada tarde  

    jueves, 11 de junio de 2015 14:58

Respuestas

  • Que tal, prueba este query y nos comentas como vas.

    declare @inicio date ='20150601';
    declare @fin date ='20150604';
    
    declare @filtro table(
        [ID] int primary key,
    	[IDPersona] int, --este debe ser el FK con persona 
    	[nombre] [varchar](50) NULL,
    	[fecha] [date] NULL,
    	[hora] [char](5) NULL
    );
    insert into @filtro
    select 1,1,'luis martinez','20150601','08:15' union all
    select 2,1,'luis martinez','20150602','08:15' union all
    select 3,1,'luis martinez','20150603','07:58' union all
    select 4,1,'luis martinez','20150604','07:58' union all
    select 5,2,'luis temprano','20150604','08:15'
    
    select f1.IDPersona, f1.nombre,f1.fecha,f1.hora  
    into #tempo 
    from @filtro f1
    where
    --tarde--
    not ((f1.hora>= '07:01' and f1.hora<='07:20') or (f1.hora>='08:01' and f1.hora<='08:20') or (f1.hora>='09:01' and f1.hora<='09:20') or (f1.hora>='10:01' and f1.hora<='10:20'))  
    and f1.fecha between @inicio and @fin 
    order by f1.fecha
    
    select * from #tempo
    
    --temprano
    select f1.ID, f1.IDPersona, f1.nombre,f1.fecha,f1.hora  
    from @filtro f1
    where
    --temprano--
    ((f1.hora>= '07:01' and f1.hora<='07:20') or (f1.hora>='08:01' and f1.hora<='08:20') or (f1.hora>='09:01' and f1.hora<='09:20') or (f1.hora>='10:01' and f1.hora<='10:20'))  
    and f1.fecha between @inicio and @fin 
    and f1.IDPersona not in(select distinct tt.IDPersona from #tempo tt)
    order by f1.fecha
    
    
    drop table #tempo
    

    Saludos,


    Ayacucho - Perú
    Recuerda si mi solución atiende tu consulta por favor márcala como útil y como respuesta.

    http://litigiouslobo.blogspot.com/
    El Blog de Herbert Mendoza

    jueves, 11 de junio de 2015 18:17

Todas las respuestas

  • Que tal, pero tu query ¿no funciona?, si deseas mostrar el resultado de un ID específico agregalo en tu claúsula WHERE,

    Ayudaría si brindas un poco más de ejemplo.

    select nomina,nombre,fecha,hora  
    from filtro
    where ((hora>= '07:01' and hora<='07:20') or
    (hora>='08:01' and hora<='08:20') or (hora>='09:01' and hora<='09:20') or (hora>='10:01' and hora<='10:20'))  and fecha between @inicio and @fin and ID = @ID
    order by fecha


    Saludos,


    Ayacucho - Perú
    Recuerda si mi solución atiende tu consulta por favor márcala como útil y como respuesta.

    http://litigiouslobo.blogspot.com/
    El Blog de Herbert Mendoza

    jueves, 11 de junio de 2015 15:16
  • el query funciona correctamente pero solo muestra las personas que tienen retardos...

    lo que intento hacer es mostrar el personal que no tiene retardos ... no se si me di a entender 

    jueves, 11 de junio de 2015 15:28
  • Hola,

    Podrías negar la primera condición:

    select nomina,nombre,fecha,hora  
    from filtro 
    where 
    not ((hora>= '07:01' and hora<='07:20') or (hora>='08:01' and hora<='08:20') or (hora>='09:01' and hora<='09:20') or (hora>='10:01' and hora<='10:20'))  
    and fecha between @inicio and @fin 
    order by fecha

    Si la solución propuesta atendió su consulta no olvide marcarla como respuesta.

    Willams Morales
    Arequipa - PERÚ

    • Propuesto como respuesta HunchbackMVP jueves, 11 de junio de 2015 17:39
    jueves, 11 de junio de 2015 15:39
  • Claro, niega la primera sentencia, un poco de álgebra booleana.

    Saludos,


    Ayacucho - Perú
    Recuerda si mi solución atiende tu consulta por favor márcala como útil y como respuesta.

    http://litigiouslobo.blogspot.com/
    El Blog de Herbert Mendoza

    jueves, 11 de junio de 2015 16:06
  • Willams Morales el query si realiza la condición pero me sigue personal que tiene retardos...

    por ejemplo:

    luis martines los primeros dias de la semana llego a las 8:15 pero los últimos dos llego a las 07:58, al realizar el query me arroja a luis martines que llego temprano por los dos últimos días.

    la nueva pregunta seria ¿Como puedo seleccionar al personal que ningún día de la semana allá llegado tarde? 

    perdon por las molestias  

    jueves, 11 de junio de 2015 16:51
  • Willams Morales el query si realiza la condición pero me sigue personal que tiene retardos...

    por ejemplo:

    luis martines los primeros dias de la semana llego a las 8:15 pero los últimos dos llego a las 07:58, al realizar el query me arroja a luis martines que llego temprano por los dos últimos días.

    la nueva pregunta seria ¿Como puedo seleccionar al personal que ningún día de la semana allá llegado tarde? 

    perdon por las molestias  

    Si la sugerencia dada por Williams a tu pregunta original te ayudo a resolver ese problema entonces marcala como respuesta.

    En cuanto a tu segunda pregunta, es preferible que habras un nuevo hilo para que quines participan en este foro tengan mayor probabilidad de encontrar preguntas similares.


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    jueves, 11 de junio de 2015 17:39
  • Que tal, prueba este query y nos comentas como vas.

    declare @inicio date ='20150601';
    declare @fin date ='20150604';
    
    declare @filtro table(
        [ID] int primary key,
    	[IDPersona] int, --este debe ser el FK con persona 
    	[nombre] [varchar](50) NULL,
    	[fecha] [date] NULL,
    	[hora] [char](5) NULL
    );
    insert into @filtro
    select 1,1,'luis martinez','20150601','08:15' union all
    select 2,1,'luis martinez','20150602','08:15' union all
    select 3,1,'luis martinez','20150603','07:58' union all
    select 4,1,'luis martinez','20150604','07:58' union all
    select 5,2,'luis temprano','20150604','08:15'
    
    select f1.IDPersona, f1.nombre,f1.fecha,f1.hora  
    into #tempo 
    from @filtro f1
    where
    --tarde--
    not ((f1.hora>= '07:01' and f1.hora<='07:20') or (f1.hora>='08:01' and f1.hora<='08:20') or (f1.hora>='09:01' and f1.hora<='09:20') or (f1.hora>='10:01' and f1.hora<='10:20'))  
    and f1.fecha between @inicio and @fin 
    order by f1.fecha
    
    select * from #tempo
    
    --temprano
    select f1.ID, f1.IDPersona, f1.nombre,f1.fecha,f1.hora  
    from @filtro f1
    where
    --temprano--
    ((f1.hora>= '07:01' and f1.hora<='07:20') or (f1.hora>='08:01' and f1.hora<='08:20') or (f1.hora>='09:01' and f1.hora<='09:20') or (f1.hora>='10:01' and f1.hora<='10:20'))  
    and f1.fecha between @inicio and @fin 
    and f1.IDPersona not in(select distinct tt.IDPersona from #tempo tt)
    order by f1.fecha
    
    
    drop table #tempo
    

    Saludos,


    Ayacucho - Perú
    Recuerda si mi solución atiende tu consulta por favor márcala como útil y como respuesta.

    http://litigiouslobo.blogspot.com/
    El Blog de Herbert Mendoza

    jueves, 11 de junio de 2015 18:17