2012-06-07 12 views
6

Próbuję utworzyć oświadczenie select na datatable, aby uzyskać wiersz, który jest w zakresie dat, którego szukam. Jestem na tym nowym i nie bardzo rozumiem, jak działa ta instrukcja wyboru. Próbowałem to napisać, ale nie działa. Czy możesz mi tu podać pomocną dłoń? SiedzęC# datatable wybierz oświadczenie z datami

foundRows = dt.Select("DATE1 <= '" + date1+ "' AND DATE2 >= '" + date1+ '"'); 

Odpowiedz

7

Poza owijania dat z #, jeśli date1 jest DateTime, a nie ciąg, trzeba użyć toString (format daty), aby uzyskać prawidłowy instrukcji SQL. W przypadku debugowania ułatwia to, jeśli najpierw utworzysz ciąg zawierający twój filtr, a następnie wybierz go za pomocą tego ciągu. Następnie spójrz na ciąg znaków i użyj go w konstruktorze zapytań, aby sprawdzić poprawność sql.

+0

ok, rozumiem. string testing = date1.ToString ("MM/dd/rrrr"); DataRow [] foundRows; foundRows = dt.Wybierz ("DATA1 <= '#" + testowanie + "#" ORAZ DATA2> = "#" + testowanie + "#" "); wartość dziesiętna1 = System.Convert.ToDecimal (found [0] [0]); –

+0

co dzieje się w przypadku, gdy select nie zawiera niczego. dawny. data jest poza granicami? –

9

To najlepsze kryteria optymalnego wyszukiwania, które przetestowałem. musisz mieć daty.

FROM_DATE = 12/01/2012 TO_DATE = 12/31/2012

i Twój kolumna w DataTable przy której stosowaniu. (w moim kodzie "data")

Twoja instrukcja Select będzie taka.

DataRow[] rows = newTable.Select("date >= #" + from_date + "# AND date <= #" + to_date + "#"); 
0

Używanie tego wewnątrz komponentu skryptowego SSIS. Właśnie użyłem powyższego przykładu, który zawierał "#" wokół dat. Również konwertowałem każdy na ciąg. To działało idealnie.

Tylko na wypadek, gdybyś chciał wiedzieć, jak to skonfigurować w SSIS: Najpierw przepłynął przepływ danych przy użyciu miejsca docelowego zestawu rekordów za pomocą zmiennej Object do przechowywania zestawu rekordów.

w moim skrypcie zawarłem zmienną jako tylko do odczytu.

W głównej klasy ...

public class ScriptMain : UserComponent 
{ 

OleDbDataAdapter a = new OleDbDataAdapter(); 
System.Data.DataTable AwardedVacTable = new System.Data.DataTable(); 
... 
... 

następnie w Pre-Execute ...

public override void PreExecute() 
{ 
    base.PreExecute(); 

    a.Fill(AwardedVacTable, Variables.rsAwardedVac); 
... 
... 

następnie w sposób niestandardowy obejrzano DataTable ...

String dtFilter = "EmployeeID = " + empId.ToString() + " AND (#" + Convert.ToString(StartDate) "# <= EndDate AND #" + Convert.ToString(StartDate) + "# >= StartDate" + " OR #" + Convert.ToString(StartDate.AddDays((double)numDays)) + "# >= StartDate AND #" + Convert.ToString(StartDate.AddDays((double)numDays)) + "# <= EndDate)"; 

DataRow[] Overlaps = AwardedVacTable.Select(dtFilter); 
0

wyrażenie = "Data> # 2015-1-1 #"; DataRow [] foundRows = table.Select (expression); 与 wybierz * z nazwy tabeli, gdzie Data> '2015-1-1'