Domanda

Ho un DataTable con una colonna DateTime, "DateCol", che può essere DBNull. DataTable ha una riga con un valore NULL in questa colonna.

Sto cercando di righe di query che hanno o valore DBNull in questa colonna o di una data che è maggiore la data odierna. La data odierna è 5/11/2010. Ho costruito una query per selezionare le righe che voglio, ma non ha funzionato come previsto. La query è stata:

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

Il risultato è la seguente query:

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

Quando eseguo questa query, ottengo alcun risultato. Mi c'è voluto un po 'per capire perché. Quello che segue è la mia indagine nella finestra immediata di 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

Prove ed errori ha mostrato una differenza nei controlli data al seguente perimetro:

> 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 query funziona bene se mi avvolgo il campo DateTime a # invece di citazioni.

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

impostazioni internazionali della mia macchina è attualmente impostato su EN-US, e il formato di data breve è M / g / aaaa.

Perché la query originale restituire i risultati errati?

Perché dovrebbe funzionare bene se la data è stato confrontato con 1/31/2000, ma non contro 2/1/2000?

È stato utile?

Soluzione

Gli usi formato espressione di query # ... # per valori DateTime. virgolette singole sono utilizzate per valori di stringa. Nelle espressioni in cui si sta utilizzando virgolette singole intorno al DateTime, che sta facendo un confronto di stringhe, in cui il carattere "1" in "12/31/9999" viene prima il "5" a "5/11/2010" e il "2" in "2/1/2000", ma non il "1" a "1/31/2000", al fine Unicode.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top