none
Filtro de Hora en base de datos Sql Server a combobox VB.net

    Pregunta

  • Hola buenos días, quería saber como puedo mostrar en un combobox los datos de una columna que tengo en una base de datos. Esta base de datos recibe datos cada 15 min pero no 15 min exactos aveces tiene diferencia de segundos o incluso centésimas. Tambien recibe varios registros al mismo tiempo. Para que entiendan mejor un ejemplo:

    Mi tabla tiene 5 campos y como les decia recibe varios registros al mismo tiempo (cerca de 300)

    Id -            Fecha -                     Nombre       -     Falla          -          Sin Falla

    1  - 10/09/2016 10:00:01  -        Azul          -   Verdadero   -        Falso   

    2  - 10/09/2016 10:00:01  -        Amarillo    -   Verdadero   -        Verdadero

    3  - 10/09/2016 15:00:02  -        Azul          -   Verdadero   -        Falso

    3  - 10/09/2016 15:00:02  -        Amarillo     -   Verdadero   -        Falso

    Mi problema es que necesito elegir una fecha y una hora especifica que se encuentre en la tabla. quiero mostrar en un combobox la hora y minutos que se encuentran en una fecha seleccionada por el usuario. Pero no se como cargar solo las horas y los minutos en el combobox y que estos no se repitan 300 veces. Por ejemplo si hay 300 registros en una fecha y hora solo lo muestre como uno en el combobox. alguna idea de como hacer eso?

    antes lo hacia de esta forma:

    Dim fecha As DateTime = DtpFechaIni.Value.Date
    Dim fechaHoraIni As New DateTime(
    fecha.Year, fecha.Month, fecha.Day, Convert.ToInt32(CbxHora.Text), Convert.ToInt32(CbxMinuto.Text), 0)

     

    pero no me sirve eso por que no se los los segundos que va a tener registrado la base de datos.

    de ante mano gracias 

    sábado, 8 de octubre de 2016 16:51

Respuestas

  • adriian.91,

    Si el cálculo para el rango final es :  ( FechaInicial + 5 minutos ) entonces no necesitas un control oculto sobre el formulario, puedes agregar los minutos sobre la fecha inicial:

    cmd.Parameters.Add("@FechaInicial", SqlDbType.DateTime).Value =
                        DateTimePicker1.Value
    cmd.Parameters.Add("@FechaFin", SqlDbType.DateTime).Value =
                        DateTimePicker1.Value.AddMinutes(5)


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta adriian.91 martes, 11 de octubre de 2016 13:51
    martes, 11 de octubre de 2016 13:21
  • adriian.91,

    No estoy seguro que lo mejor sea tener desplegables para seleccionar horas y minutos, pero sobre lo que tienes puedes hacer lo siguiente:

    Dim FechaInicial As DateTime =
    	DtpFechaIni.Value.Date.Add(New TimeSpan(CInt(CbxHora.Text), CInt(CbxMin.Text), 0))
    
    cmd.Parameters.Add("@FechaInicial", SqlDbType.DateTime).Value = FechaInicial                    
    cmd.Parameters.Add("@FechaFin", SqlDbType.DateTime).Value = FechaInicial.AddMinutes(5)


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta adriian.91 martes, 11 de octubre de 2016 14:13
    martes, 11 de octubre de 2016 14:10

Todas las respuestas

  • adriian.91,

    Entiendo que los datos los deberías recuperar -tal y como los requieres- desde la base de datos, algo como lo siguiente:

    Dim ConsultaSQL As String = "SELECT DISTINCT FORMAT(Fecha, 'hh:mm') " _
    			& "FROM T WHERE Fecha >= @Fecha AND Fecha < DATEADD(DAY, 1, @Fecha)"
    
    Dim cmd As New SqlCommand(ConsultaSQL, cn)
    
    cmd.Parameters.Add("@Fecha", SqlDbType.Date).Value = DateTimePicker1.Value.Date
    
    Dim reader As SqlDataReader = cmd.ExecuteReader()
    
    While reader.Read()
    	ComboBox1.Items.Add(reader.GetString(0))
    End While


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    sábado, 8 de octubre de 2016 17:23
  • claro eso seria o ideal...   pero tengo otro problema, resulta que necesito hacer la misma consulta a tres tablas. Por lo que el combobox no podria cargar los datos de las tres tablas al mismo tiempo(eso creo), ademas hay esta mi problema por que los datos que se registran en estas tablas nunca tienen los mismos segundos. Al guardar tantos datos al mismo tiempo siempre las dos primeras tablas guardan 1 segundo antes que la tabla restante.

    Mi duda es, podria darle los valores de 15, 30, 45 y 00 min al combobox y omitir los segundos?. guiando al codigo a mostrar por hora y minutos?. Las tablas tienen registros por horas, minutos y segundos y esto no se puede cambiar.

    Para mi lo ideal seria omitir los segundos en la consulta y hacer lo que hacia antes

    Dim fecha As DateTime = DtpFechaIni.Value.Date
            Dim fechaHoraIni As New DateTime(
                fecha.Year, fecha.Month, fecha.Day, Convert.ToInt32(CbxHora.Text), Convert.ToInt32(CbxMin.Text), 0)


    domingo, 9 de octubre de 2016 20:05
  • adriian.91,

    La verdad poco entiendo lo que planteas.

    Si quieres buscar filas en una tabla discriminando los segundos entonces es buena opción que sólo consideres la fecha, horas y minutos (discriminando los segundos), sin embargo creo deberías definir un rango de búsqueda:

    Para que el objeto de tipo DateTimePicker muestre sólo la fecha, horas y minutos debes de definir el formato de presentación:

    DateTimePicker1.Format = DateTimePickerFormat.Custom
    DateTimePicker1.CustomFormat = "dd/MM/yyyy hh:mm"
    
    DateTimePicker2.Format = DateTimePickerFormat.Custom
    DateTimePicker2.CustomFormat = "dd/MM/yyyy hh:mm"

    Definiendo un rango entre ambas tablas y con un valor de 0 segundos realizar la expresión de filtro en la consulta será simple:

    WHERE
        Fecha BETWEEN @FechaInicio AND @FechaFin


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    lunes, 10 de octubre de 2016 0:47
  • Entiendo lo que dices, pero existe la posibilidad de que el segundo DateTimePicker no se vea(que el usuario no lo pueda manipular), y establecer que su valor sea 5 min mas que el primer datetimepicker?

    Ejemplo 

    Dtp1: 09/10/2016 10:00 (Este lo establece el usuario)

    Dtp2: 09/10/2016 10:05 (Este lo establece el programa de forma automática)

     

    martes, 11 de octubre de 2016 13:11
  • adriian.91,

    Si el cálculo para el rango final es :  ( FechaInicial + 5 minutos ) entonces no necesitas un control oculto sobre el formulario, puedes agregar los minutos sobre la fecha inicial:

    cmd.Parameters.Add("@FechaInicial", SqlDbType.DateTime).Value =
                        DateTimePicker1.Value
    cmd.Parameters.Add("@FechaFin", SqlDbType.DateTime).Value =
                        DateTimePicker1.Value.AddMinutes(5)


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta adriian.91 martes, 11 de octubre de 2016 13:51
    martes, 11 de octubre de 2016 13:21
  • Muchas gracias Willams es lo que necesitaba. Te planteo mi ultima duda podemos hacer eso con un "DTP" y dos "CBX", como lo tenia antes? 

    Dim fecha As DateTime = DtpFechaIni.Value.Date Dim fechaHoraIni As New DateTime( fecha.Year, fecha.Month, fecha.Day, Convert.ToInt32(CbxHora.Text), Convert.ToInt32(CbxMin.Text), 0)

    Dim fechafin = DtpFechaIni.Value.AddMinutes(5)

    Se podría hacer así?

    • Editado adriian.91 martes, 11 de octubre de 2016 13:50
    martes, 11 de octubre de 2016 13:45
  • adriian.91,

    No estoy seguro que lo mejor sea tener desplegables para seleccionar horas y minutos, pero sobre lo que tienes puedes hacer lo siguiente:

    Dim FechaInicial As DateTime =
    	DtpFechaIni.Value.Date.Add(New TimeSpan(CInt(CbxHora.Text), CInt(CbxMin.Text), 0))
    
    cmd.Parameters.Add("@FechaInicial", SqlDbType.DateTime).Value = FechaInicial                    
    cmd.Parameters.Add("@FechaFin", SqlDbType.DateTime).Value = FechaInicial.AddMinutes(5)


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta adriian.91 martes, 11 de octubre de 2016 14:13
    martes, 11 de octubre de 2016 14:10
  • Gracias Willams, por la ayuda y  por la paciencia.
    martes, 11 de octubre de 2016 14:14