0

このクエリで日付を使用する日付ピッカーが 2 つあります。

da = new SqlDataAdapter(@"
        select * from TotalBill 
        where SaudaDate between 
                 convert(datetime,'" + dtpForDate.Value.Date.ToString("MM/dd/yyyy") + "') 
             and convert(datetime,'" + dtpToDate.Value.Date.ToString("MM/dd/yyyy") + "')"
                       , con);
DataSet ds = new DataSet();
da.Fill(ds);
gvDailyBill.DataSource = ds.Tables[0];

ある日を照会したい場合、両方の日付ピッカーを同じ日に設定することはできませんが、希望するFrom日に設定し、それ以降の日に設定する必要がありToます。そうしないと、クエリは次のようになります。

select * from totalbill where SaudaDate between '1/2/2013' and '1/2/2013'

もちろん、これは0行を返します。コードまたはクエリを変更して、日付ピッカーで同じ日を選択できるようにするにはどうすればよいですか?

4

5 に答える 5

3

最初に重要:
パラメーター化されたクエリが必要です。

var fromDate = dtpForDate.Value.Date;
var toDate = dtpToDate.Value.Date;

string selectSQL = "select * from TotalBill where SaudaDate between @start and @end";
da = new SqlDataAdapter();         

SqlCommand selectCMD = new SqlCommand(selectSQL, con);
da.SelectCommand = selectCMD;

selectCMD.Parameters.Add("@start ", SqlDbType.DateTime).Value = fromDate;
selectCMD.Parameters.Add("@end", SqlDbType.DateTime).Value = toDate;
DataSet ds = new DataSet();
da.Fill(ds);
gvDailyBill.DataSource = ds.Tables[0];

次に、日付でフィルタリングします。しかし、開始日が終了日と同じ場合は、1 日全体のデータが必要です。
開始日と終了日が異なる場合はどうなりますか? 終了日のすべての値も含めますか?

Sql に「01/01/2010」と言うと、「01/01/2010 00:00:00」と理解します。日付でフィルタリングすることはできませんが、日付*時間*でフィルタリングします。これは重要な違いです。

したがって、あなたの場合、正しいクエリは次のとおりです。

var fromDate = dtpForDate.Value.Date;
var toDate = dtpToDate.Value.Date.AddDays(1); // trick, add one day

この場合、fromDate == toDate == '1/2/2013' とすると、'1/2/2013 00:00:00' から '1/3/2013' 00:00 までのすべてのデータが取得されます。 00'. 純粋な英語では、2013 年 1 月 2 日のすべてのデータが取得されます。

于 2013-04-03T10:29:08.870 に答える
1

日付を含めたい場合は、その間を使用しないでください。以上/以下を使用します。

select * from totalbill where SaudaDate >= '2013-02-01' and SaudaDate <= '2013-02-01'

編集。日付列が実際に 00:00:00.000 以外の日時の場合は、単一の日付の場所で「Like」を使用する必要があります。

select * from totalbill where SaudaDate like '2013-02-01%'

または、プログラムで 2 番目の日付に 1 日を追加する必要があります。

select * from totalbill where SaudaDate >= '2013-02-01' and SaudaDate <= '2013-02-02'
于 2013-04-03T10:33:44.480 に答える