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?
Merci, cela a du sens. –