Filtrar un DataSet por fechas.

31/08/2006 - 17:17 por Roberto | Informe spam
Como decía Nicolas Cage en La Roca: ¿Podría alguien explicarme, por los
testiculos del minotauro...
... cual es la manera correcta de filtrar fechas en un DataSet o Datatable?

Utilizando el operador .Select en una tabla de un Dataset o un Datatable me
encuentro que las fechas las tengo que introducir entre comillas simples y
las horas entre #. Si pongo las fechas entre # me dice que 'no se puede
reconocer la cadena como un DateTime válido', pero si pongo las comillas a
veces me devuelve registros y a veces no, es una lotería.

Esto me funciona en tres DataSet y misteriosamente no en otro que tiene la
misma estructura:
- Todos los DataSets se han cargado desde tablas de Access 2000.
- OleDBConnection y OleDBDataAdapter son iguales, básicamente cortar y
pegar cambiando nombres de fichero y tablas.
- Las campos son tipo FechaHora sin formato
- Si inspecciono la variable SQLFechaHoraActivo y pego la consulta en
Access sólo tengo que cambiar las comillas por # para que funcione.

Dim SQLFechaHoraActivo As String = " AND Activo = True AND
(FechaActivacion Is Null OR FechaActivacion < '" & Now.ToString("dd/MM/yyyy")
& "') AND (FechaFinalizacion Is Null OR FechaFinalizacion > '" &
Now.ToString("dd/MM/yyyy") & "') AND (HoraActivacion Is Null OR
HoraActivacion < #" & Now.ToString("hh:mm:ss") & "#) AND (HoraFinalizacion Is
Null OR HoraFinalizacion > #" & Now.ToString("hh:mm:ss") & "#)"

'La consulta queda así: " AND Activo = True AND (FechaActivacion Is Null OR
FechaActivacion < '31/8/2006') AND (FechaFinalizacion Is Null OR
FechaFinalizacion > '31/8/2006') AND (HoraActivacion Is Null OR
HoraActivacion < #04:21:26#) AND (HoraFinalizacion Is Null OR
HoraFinalizacion > #04:21:26#)"

DataAdapter = New OleDbDataAdapter("SELECT * FROM Tabla", Conexion)
'Estos DataSets sólo los tengo que leer, así que pongo la tabla en el
DataAdapter.Fill y no en DataAdapter.TableMappings.
DataAdapter.Fill(MiDS, "Tabla")

Dim dr() As DataRow = MiDS.Tables("Tabla").Select("Codigo = '" & Codigo &
"'" & SQLFechaHoraActivo, "Codigo")

Da igual como calcule la fecha actual, si la pongo entre # me dice que no es
un formato DateTime válido y si no recuerdo mal he probado todas estas:
Now.Date
Now.Date.ToString
Now.ToString("dd/MM/yyyy")
Format(Now,"dd/MM/yyyy")
Format(Now.Date,"dd/MM/yyyy")
CDate(Now.ToString("dd/MM/yyyy"))
CType(Now.ToString("dd/MM/yyyy"), Date)
 

Leer las respuestas

#1 SoftJaén
31/08/2006 - 20:30 | Informe spam
"Roberto" preguntó:

... cual es la manera correcta de filtrar fechas en un DataSet o
Datatable?

Utilizando el operador .Select en una tabla de un Dataset o un Datatable
me encuentro que las fechas las tengo que introducir entre comillas
simples y las horas entre #. Si pongo las fechas entre # me dice que
'no se puede reconocer la cadena como un DateTime válido', pero si
pongo las comillas a veces me devuelve registros y a veces no, es una
lotería.



Hola, Roberto:

Para filtrar un campo Fecha mediante el método «Select», deberás de encerrar
entre almohadillas (#) la fecha en formato americano (#mes/día/año#), y
entre comillas simples (') si especificas el formato de fecha español
('dia/mes/año').

Pero si utilizas las almohadillas con el formato español, o las comillas con
el formato americano, obtendrás la excepción oportuna.

Si por ejemplo, la variable FechaActivacion es del tipo String,
especificarías la fecha de hoy en formato español de la siguiente manera:

Dim FechaActivacion As String = Now.ToShortDateString
Dim criterio As String = "Fecha='" & FechaActivacion & "'"

Dim dr() As DataRow = MiDS.Tables("Tabla").Select(criterio, "Codigo")

Try
MessageBox.Show(dr(0).Item("Codigo").ToString, dr.Length.ToString)

Catch ex As Exception
MessageBox.Show(ex.Message)

End Try

Un saludo

Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.

Preguntas similares