Tengo el siguiente código:


            DataTable t = new DataTable();
            t.Locale = CultureInfo.InvariantCulture;
            t.Columns.Add("Date", typeof(DateTime));

            DateTime today = DateTime.Now;
            DateTime yesterday = today.AddDays(-1);
            DateTime tomorow = today.AddDays(1);

            t.Rows.Add(yesterday);
            t.Rows.Add(today);
            t.Rows.Add(tomorow);

            string filter = string.Format(CultureInfo.InvariantCulture,
                "Date >= #{0}# AND Date <= #{1}#", yesterday, tomorow);

            t.DefaultView.RowFilter = filter;

            foreach (DataRowView v in t.DefaultView)
                Console.WriteLine(v["date"]);
 

Estoy esperando a que el filtrado t.DefaultView ahora contiene todas las tres «días». Pero por alguna razón a la última fecha de la gama no está incluido. Parece <= operador para DateTime tipo funciona como un <.

Donde está el problema? Es que un error? Alguna sugerencia de cómo superar eso?

Actualización.
Tengo algunas respuestas acerca de DateTime tipo y operadores de comparación. Gracias.
Pero ahora quiero dirigir la atención a expresión de filtro.
Ok, decir que tengo el folloving bucle:


foreach (DataRow r in t.Rows)
{
  DateTime date = (DateTime)r["Date"];
  if (yesterday <= date && date <= tomorow)
      Console.WriteLine(date);
}
 

Este bucle se debe mostrar el mismo resultado como


foreach (DataRowView v in t.DefaultView)
  Console.WriteLine(v["date"]);
 

del ejemplo anterior, ¿sí? No! Aquí <= funciona como estoy a la espera y el resultado es que los tres días. Por qué?

Actualización #2: solución.
Como Joe ha señalado – el problema es acerca de fracciones de segundo.
Si puedo cambiar el formato de los límites superior e inferior de ida de la fecha/hora de patrón (para conservar las fracciones de un segundo, y todo funciona bien:



string filter = string.Format(CultureInfo.InvariantCulture,
                "Date >= '{0}' AND Date <= '{1}'",
                yesterday.ToString("o", CultureInfo.InvariantCulture),
                tomorow.ToString("o", CultureInfo.InvariantCulture));
 
InformationsquelleAutor Tadas Šukys | 2009-12-21

3 Comentarios

  1. 1

    El código que has publicado en su actualización no es equivalente a la de los filtros de fila.
    Su filtro de fila de los formatos de la fecha usando el formato general para la cultura actual. Probablemente esto no incluye las fracciones de un segundo – por lo tanto, a menos que ocurra llamar a DateTime.Ahora en un segundo límite, su tomorrow valor de algunas fracciones de segundo más allá del rango especificado por el filtro.

    I. e. si su tomorrow valor es «2009-12-23 01:02:03.456′, su filtro de fila a tomar sólo valores de hasta y incluyendo «2009-12-23 01:02:03′, unas fracciones de segundo antes de que el valor especificado por la mañana.

    Si sólo desea comparar fechas, usted debe usar DateTime.La fecha para truncar el componente de tiempo de las fechas (y usar DateTime.Hoy en lugar de DateTime.Ahora para la fecha actual).

  2. 2

    De la fecha en que la comparación se toma el tiempo en cuenta. Así, por ejemplo, «hoy al mediodía» es mayor que la de «hoy». Si utiliza DateTime.Now, el tiempo está incluido. Por lo tanto, si DateTime.Now es «el día de hoy al mediodía», entonces tomorrow = today.AddDays(1) es menor que «mañana a las 3 de la tarde»… Entonces usted necesita para pasar por alto la parte de tiempo de la fecha. Usted puede hacerlo mediante el formato de la fecha sin la hora. También, si quieres comprobar que una fecha es «menor o igual que el día de mañana» (independientemente de la hora), compruebe que se está «estrictamente menor que el día después de mañana» :

    string filter = string.Format(CultureInfo.InvariantCulture,
                    "Date >= #{0:MM/dd/yyyy}# AND Date < #{1:MM/dd/yyyy}#",
                    yesterday,
                    tomorrow.AddDays(1));
    • Funciona bien!. Gracias.
  3. 1

    Tratar con

    DateTime today = DateTime.Today;

    si no se soluciona, comprobar si el campo de fecha que contiene el tiempo también. ahí radica su problema.

    Actualización: tu segundo comentario.

    cuando se compara con fecha y hora.Ahora por ejemplo, Fecha <= 21.12.2009 14:35:35, se tomarán todas antes de las 14:35 horas y se llevará a ignorar las filas posteriores. Espero que esto ayude.

    Consulte el artículo siguiente para obtener más idea

    http://dotnetguts.blogspot.com/2007/06/understanding-datetime-and-timespan-in.html

    • Funciona bien cuando el tiempo no establecido (utilizando DateTime.Hoy, por ejemplo). Pero eso no es suficiente.
    • ¿Qué necesitas más?
    • Lo que he sugerido – que no es la solución. Que funciona cuando el tiempo no está configurado. Pero, ¿por qué no funciona con el tiempo? Por qué operador >= obras y <= no? Lo he publicado aquí sólo es una prueba/ejemplo. Estoy buscando más explicación general.

Dejar respuesta

Please enter your comment!
Please enter your name here