none
Consulta SQL RRS feed

  • Pregunta

  • Hola, buenas 

    tengo el siguiente conjunto de datos devuelto de un SP.

    PERIODO	               HORA MINUTO
    06:12:15 - 06:12:15	0	0
    06:12:15 - 06:12:15	0	0
    06:15:50 - 06:15:50	0	0
    06:15:50 - 06:15:50	0	0
    06:15:50 - 06:15:50	0	0
    06:15:50 - 06:15:50	0	0
    06:17:00 - 07:49:07	1	32
    08:22:55 - 08:22:55	0	0
    08:22:55 - 08:22:55	0	0
    08:24:00 - 10:44:50	2	20
    12:16:54 - 12:16:54	0	0
    12:16:54 - 12:16:54	0	0
    18:11:13 - 18:11:13	0	0
    18:11:13 - 18:11:13	0	0
    18:11:13 - 18:11:13	0	0
    18:11:13 - 18:11:13	0	0
    18:12:48 - 20:07:04	2	5
    21:19:00 - 21:19:00	0	0
    21:19:00 - 21:19:00	0	0
    06:14:45 - 06:14:45	0	0
    06:14:45 - 06:14:45	0	0

    el tema es, como puedo modificar el select del SP para que entregue todos los registros que sean mayores a cero???

    La única condición es que ambos sean ceros para quedar fuera, si hora es cero y minuto no, o viceversa, entonces si mostrar.

    No sé como crear el select para hacer eso.

    Muchas gracias a todos.

    Saludos

    lunes, 6 de abril de 2020 15:42

Respuestas

  • Hola Enrique Aleman:

    Con un varchar, puedes realizarlo de la misma manera:

    declare @tabla table (var_hora varchar(200), hora int, minuto int) insert into @tabla (var_hora, hora, minuto) values ('06:12:15 - 06:12:15',0,0 ), ('06:12:15 - 06:12:15',0,0 ), ('06:15:50 - 06:15:50',0,0 ), ('06:15:50 - 06:15:50',0,0 ), ('06:15:50 - 06:15:50',0,0 ), ('06:15:50 - 06:15:50',0,0 ), ('06:17:00 - 07:49:07',1,32), ('08:22:55 - 08:22:55',0,0), ('08:22:55 - 08:22:55',0,0), ('08:24:00 - 10:44:50',2,20), ('12:16:54 - 12:16:54',0,0), ('12:16:54 - 12:16:54',0,0), ('18:11:13 - 18:11:13',0,0), ('18:11:13 - 18:11:13',0,0), ('18:11:13 - 18:11:13',0,0), ('18:11:13 - 18:11:13',0,0), ('18:12:48 - 20:07:04',2,5), ('21:19:00 - 21:19:00',0,0), ('21:19:00 - 21:19:00',0,0), ('06:14:45 - 06:14:45',0,0), ('06:14:45 - 06:14:45',0,0);

    -- Solución 1 SELECT * From @tabla t WHERE DATEDIFF(minute,(cast((SUBSTRING(t.var_hora, 1, 8)) as datetime)), (cast((SUBSTRING(t.var_hora,11,LEN(t.var_hora))) as datetime))) > 0

    -- Solución 2

    select * 
     From @tabla t
     where
     t.hora >0 or t.minuto > 0


    Solución 1: Sólo tienes que recoger en un substring la parte de la hora de inicio y la parte de la hora final. Convertirlas a datetime. Y de estas utilizar la función dateDiff. Si la diferencia es mayor que cero minutos, cualquiera de hora minuto es diferente.

    Solución 2: Si ya tienes la hora y minutos, con decirle que hora >0 o minuto >0 también te valdría.

    • Marcado como respuesta Enrique Aleman lunes, 6 de abril de 2020 20:26
    lunes, 6 de abril de 2020 20:05

Todas las respuestas

  • Hola Enrique Aleman:

    De que tipo de datos hablamos.

    Voy a suponer que son time.

    declare @tabla table (inicio time, fin time, hora int, minuto int)
    insert into @tabla (inicio, fin, hora, minuto)
    values
    ('06:12:15','06:12:15',0,0 ),
    ('06:12:15','06:12:15',0,0 ),
    ('06:15:50','06:15:50',0,0 ),
    ('06:15:50','06:15:50',0,0 ),
    ('06:15:50','06:15:50',0,0 ),
    ('06:15:50','06:15:50',0,0 ),
    ('06:17:00','07:49:07',1,32);
    
    select * ,
    DATEDIFF(minute,(cast(t.inicio as datetime)),(cast(t.fin as datetime))) 
     From @tabla t
    
    

    Si observas la query, puedes castear a datetime, y utilizar un datediff para ver la diferencia en minutos entre las dos columnas.

    Si es mayor que 0 alguna de las dos tiene contenido.

    declare @tabla table (inicio time, fin time, hora int, minuto int)
    insert into @tabla (inicio, fin, hora, minuto)
    values
    ('06:12:15','06:12:15',0,0 ),
    ('06:12:15','06:12:15',0,0 ),
    ('06:15:50','06:15:50',0,0 ),
    ('06:15:50','06:15:50',0,0 ),
    ('06:15:50','06:15:50',0,0 ),
    ('06:15:50','06:15:50',0,0 ),
    ('06:17:00','07:49:07',1,32);
    
    select * 
    From @tabla t
     where 
    DATEDIFF(minute,(cast(t.inicio as datetime)),(cast(t.fin as datetime)))  > 0
    

    lunes, 6 de abril de 2020 16:03
  • Hola Enrique Aleman, 

      

    Gracias por levantar tu consulta en los foros de MSDN. Entendimos su pregunta y vamos a darle seguimiento para buscar la mejor repuesta pertinente al caso. 

      

    Cualquier duda referente a productos Microsoft, puedes consultarnos. Es un gusto informarte. 

    Gracias por usar los foros de MSDN. 

      

      

    Eric Ruiz

     ____________________________ 

      

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.  

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.   

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft. 

    lunes, 6 de abril de 2020 16:04
  • Estimado, gracias por tu respuesta.

    pero lo único que necesito validar es la hora y minuto, no los datetime (fechas)

    si hora y minuto son cero, entonces no mostrar en select.

    si hora es cero y minuto no, mostrar.

    si minuto es cero y hora no, mostrar.

    eso.

    Gracias!

    lunes, 6 de abril de 2020 16:07
  • Hola Enrique Aleman:

    pero lo único que necesito validar es la hora y minuto, no los datetime (fechas)

    En mi código no hay ninguna fecha. Hay campos de tipo time.

    Si posteareas como es la estructura de tus datos, a lo mejor la respuesta podría ser más cercana a lo que tú consideras correcto. 

    lunes, 6 de abril de 2020 17:35
  • Hola, asi construyo el periodo dentro del SP.

    SET @VAR_PERIODO	= '' + CONVERT(VARCHAR, @VAR_HORA_INI, 8) + ' - ' + CONVERT(VARCHAR, @VAR_HORA_TER, 8);
    es un varchar(200)

    lunes, 6 de abril de 2020 18:09
  • Hola Enrique Aleman:

    Con un varchar, puedes realizarlo de la misma manera:

    declare @tabla table (var_hora varchar(200), hora int, minuto int) insert into @tabla (var_hora, hora, minuto) values ('06:12:15 - 06:12:15',0,0 ), ('06:12:15 - 06:12:15',0,0 ), ('06:15:50 - 06:15:50',0,0 ), ('06:15:50 - 06:15:50',0,0 ), ('06:15:50 - 06:15:50',0,0 ), ('06:15:50 - 06:15:50',0,0 ), ('06:17:00 - 07:49:07',1,32), ('08:22:55 - 08:22:55',0,0), ('08:22:55 - 08:22:55',0,0), ('08:24:00 - 10:44:50',2,20), ('12:16:54 - 12:16:54',0,0), ('12:16:54 - 12:16:54',0,0), ('18:11:13 - 18:11:13',0,0), ('18:11:13 - 18:11:13',0,0), ('18:11:13 - 18:11:13',0,0), ('18:11:13 - 18:11:13',0,0), ('18:12:48 - 20:07:04',2,5), ('21:19:00 - 21:19:00',0,0), ('21:19:00 - 21:19:00',0,0), ('06:14:45 - 06:14:45',0,0), ('06:14:45 - 06:14:45',0,0);

    -- Solución 1 SELECT * From @tabla t WHERE DATEDIFF(minute,(cast((SUBSTRING(t.var_hora, 1, 8)) as datetime)), (cast((SUBSTRING(t.var_hora,11,LEN(t.var_hora))) as datetime))) > 0

    -- Solución 2

    select * 
     From @tabla t
     where
     t.hora >0 or t.minuto > 0


    Solución 1: Sólo tienes que recoger en un substring la parte de la hora de inicio y la parte de la hora final. Convertirlas a datetime. Y de estas utilizar la función dateDiff. Si la diferencia es mayor que cero minutos, cualquiera de hora minuto es diferente.

    Solución 2: Si ya tienes la hora y minutos, con decirle que hora >0 o minuto >0 también te valdría.

    • Marcado como respuesta Enrique Aleman lunes, 6 de abril de 2020 20:26
    lunes, 6 de abril de 2020 20:05
  • Muchas gracias estimado, la opción dos fue la solución.

    Gracias!!!

    lunes, 6 de abril de 2020 20:26