2010-05-11 27 views
0

J'ai un DataTable avec une colonne DateTime, "DateCol", qui peut être DBNull. Le DataTable a une ligne avec une valeur NULL dans cette colonne.DataTable.Select Se comporte étrangement en utilisant l'opérateur ISNULL sur la colonne DateTime NULL

Je tente d'interroger les lignes qui ont la valeur DBNull dans cette colonne ou une date qui est supérieure à la date d'aujourd'hui. La date de la journée est le 5/11/2010. J'ai construit une requête pour sélectionner les lignes que je veux, mais cela n'a pas fonctionné comme prévu. La requête était:

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

Il en résulte la requête suivante:

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

Quand je lance cette requête, je reçois aucun résultat. Il m'a fallu du temps pour comprendre pourquoi. Ce qui suit est mon enquête dans la fenêtre immédiate Visual Studio:

> 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 

tâtonnement a montré une différence dans les contrôles de date à la limite suivante:

> 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 

Le La requête fonctionne correctement si j'emballe le champ DateTime dans # au lieu de guillemets.

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

paramètres régionaux de ma machine est actuellement fixé à la norme EN-US, et le format de date courte est M/d/yyyy.

Pourquoi la requête d'origine a-t-elle renvoyé des résultats incorrects?

Pourquoi cela fonctionnerait-il correctement si la date était comparée au 1/31/2000 mais pas au 2/1/2000?

Répondre

4

Le format d'expression de requête utilise # ... # pour les valeurs DateTime. Les guillemets simples sont utilisés pour les valeurs de chaîne. Dans les expressions où vous utilisez des guillemets simples autour du DateTime, il effectue une comparaison de chaînes, dans laquelle le caractère "1" dans "31/12/9999" précède le "5" dans "5/11/2010" et le "2" dans "2/1/2000", mais pas le "1" dans "1/31/2000", dans l'ordre Unicode.

+0

Merci, cela a du sens. –