DataTable.Select comporta de forma extraña Usando ISNULL operador en NULL Fecha y hora de la columna

StackOverflow https://stackoverflow.com/questions/2812383

Pregunta

Tengo un DataTable con una columna DateTime, "DateCol", que puede ser DBNull. El DataTable tiene una fila en ella con un valor NULL en esta columna.

Estoy tratando de filas de consulta que tienen cualquiera de los valores DBNull en esta columna o una fecha que es mayor que la fecha de hoy. La fecha de hoy es 5/11/2010. Construí una consulta para seleccionar las filas que quiero, pero no funcionó como se esperaba. La consulta fue:

string query = "ISNULL(DateCol, '" + DateTime.MaxValue + "'") > "' + DateTime.Today "'"

Esto resulta en la siguiente consulta:

"ISNULL(DateCol, '12/31/9999 11:59:59 PM') > '5/11/2010'"

Al ejecutar esta consulta, no da resultados positivos. Me tomó un tiempo para averiguar por qué. Lo que sigue es mi investigación en el estudio ventana inmediata visual:

> dt.Rows.Count
1
> dt.Rows[0]["DateCol"]
{}
> dt.Rows[0]["DateCol"] == DBNull.Value
true
> dt.Select("ISNULL(DateCol,'12/31/9999 11:59:59 PM') > '5/11/2010'").Length
0  <-- I expected 1

Ensayo y error mostró una diferencia en los controles de fecha en el siguiente límite:

> dt.Select("ISNULL(DateCol, '12/31/9999 11:59:59 PM') > '2/1/2000'").Length
0
> dt.Select("ISNULL(DateCol, '12/31/9999 11:59:59 PM') > '1/31/2000'").Length
1 <-- this was the expected answer

La consulta funciona bien si envuelvo el campo DateTime en # en lugar de comillas.

> dt.Select("ISNULL(DateCol, #12/31/9999#) > #5/11/2010#").Length
1

Mi configuración regional del equipo está configurado actualmente para EN-US, y el formato de fecha corta es M / d / aaaa.

¿Por qué la búsqueda original devuelve los resultados incorrectos?

¿Por qué iba a funcionar bien si la fecha se comparó contra el 31/01/2000, pero no contra 2/1/2000?

¿Fue útil?

Solución

Los usos formato de expresión consulta # # ... para los valores de fecha y hora. Las comillas simples se utilizan para los valores de cadena. En las expresiones las que se utilizan comillas simples alrededor del DateTime, que está haciendo una comparación de cadenas, en la que el carácter "1" en "12/31/9999" viene antes del "5" en "5/11/2010" y el "2" en "2/1/2000", pero no el "1" en "31.01.2000", con el fin Unicode.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top