1

dt私は2つの列FromDateを持つDataTableを持っていますToDate. 日付blackOutFromDateを入力するテキストボックスが 2 つあり、 blackOutToDate. たとえば、 DataTable 内に 7 行ありますdt

From Date       To Date      
8/21/2012   To  8/22/2012   
8/23/2012   To  8/24/2012   
8/25/2012   To  8/25/2012   
8/5/2012    To  8/6/2012    
8/26/2012   To  8/27/2012   
8/1/2012    To  8/2/2012    
8/3/2012    To  8/3/2012

テキストボックス内に入力した値が DataTable の一致する日付範囲内にあるCheckInDate場合、そのような一致を持つ行の数を返す必要があります。CheckOutDatedt

私がやっている

foundRows = _blackOutTable.Select
                               (
                                   "(FromDate <='" +     
blackOutFromDate.ToShortDateString() + "' AND ToDate >= '" + 
blackOutFromDate.ToShortDateString() + "')"
                                   + "OR (FromDate <='" + 
blackOutToDate.ToShortDateString() + "' AND ToDate >='" + 
blackOutToDate.ToShortDateString() + "')"
                                   + "OR (FromDate >='" + 
blackOutFromDate.ToShortDateString() + "' AND FromDate <='" +     
blackOutToDate.ToShortDateString() + "')"
                                   + "OR (ToDate >= '" +   
blackOutFromDate.ToShortDateString() + "' AND ToDate <='" +     
blackOutToDate.ToShortDateString() + "')"
                               );
if (foundRows.Length == 0)
{
}

EDIT:SQlサーバー内にファイルされたDateFromとDateToを次のように保存しています

CAST(MONTH(date1) AS VARCHAR(2)) + '/' + CAST(DAY(date1) AS VARCHAR(2)) + '/' +     
CAST(YEAR(date1) AS VARCHAR(4))  [fromdate],
        CAST(MONTH(date2) AS VARCHAR(2)) + '/' + CAST(DAY(date2) AS 
VARCHAR(2)) + '/' + CAST(YEAR(date2) AS VARCHAR(4))  [todate]

blackOutFromDate と blackOutFromDate は DateTime タイプです。

しかし、正しい値が返されません。選択式に問題があります。これを修正するにはどうすればよいですか?

4

3 に答える 3

0

データベースでこれをしないのはなぜですか?

WHERE (1=1) 
AND 
( 
    @in_ReportingDate BETWEEN Cast(Floor(Cast(ZO_RMArea_DateFrom As Float)) As DateTime) AND Cast(Floor(Cast(ZO_RMArea_DateTo As Float)) As DateTime) 
    OR ZO_RMArea_DateFrom IS NULL 
    OR ZO_RMArea_DateTo IS NULL 
) 

また、注意 - DateTime 値があります。ToShortDateString を実行すると、date.00:00:00.000 になりますが、FromDate は date.23:59:59.995 になります。

それが Cast(Floor(Cast の目的です。比較で時間を切り捨てるためです。

于 2012-07-18T08:33:35.377 に答える
0

これはDataTable.Select構文for DateTimesです:

foundRows = _blackOutTable.Select("FromDate >= #2012-07-13#")

したがってString.Format、日付変数をその文字列に入れるために使用する必要があります。

編集: datetime は varchar に変換され、それを変更できないため、それらを解析して datetime に戻す必要があります。使用することをお勧めしますLinq-To-DataSet

DataTable tblFiltered;
var invCulture=System.Globalization.CultureInfo.InvariantCulture;
var filteredRows = _blackOutTable.AsEnumerable()
    .Where(r => DateTime.Parse(r.Field<String>("FromDate"), invCulture) >= blackOutFromDate
             && DateTime.Parse(r.Field<String>("ToDate"),   invCulture) <= blackOutToDate);

if (filteredRows.Any())
{
    tblFiltered = filteredRows.CopyToDataTable();
}

を使用foreachしてすべての行を列挙したり、フィルター処理された からCopyToDataTable新しい行を作成したりできます。DataTableDataRows

于 2012-07-18T08:23:59.867 に答える
0

これを試して

int rowCount = blackOutTable.AsEnumerable()
            .Count(c => ((DateTime)c["FromDate"]) >= blackOutFromDate && ((DateTime)c["ToDate"]) <= blackOutToDate);
于 2012-07-18T09:19:41.563 に答える