0

我有两个日期选择器,其日期将在此查询中使用:

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];

其次,您按日期过滤。但是当您的开始日期等于结束日期时,您需要全天的数据。
如果开始日期和结束日期不同怎么办?是否也要包含结束日期的所有值?

当您对 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,那么您将需要在 where 中使用“Like”作为单个日期。

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

或者您需要以编程方式将一天添加到第二个日期。

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

您的查询必须如下所示...

"select * from TotalBill 
        where CONVERT(VARCHAR(10), SaudaDate, 101) between 
                 convert(datetime,'" + dtpForDate.Value.Date.ToString("MM/dd/yyyy") + "') 
             and convert(datetime,'" + dtpToDate.Value.Date.ToString("MM/dd/yyyy") + "')"

SaudaDate是日期时间格式....所以可能是这样的'1/2/2013 07:54:00'

如果你像这样转换CONVERT(VARCHAR(10), SaudaDate, 101)它就会变成'1/2/2013 00:00:00'

现在它会给你你需要的结果..

尝试一下...

于 2013-04-03T10:42:20.500 回答
0

您只需要转换SaudaDate为日期部分。尝试以下操作:

try
{
    da = new SqlDataAdapter(@"
            select * from TotalBill 
            where Cast(Convert(varchar(20),SaudaDate,101) as Datetime) 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];
}
catch (Exception ex){}

此代码也适用于同一天的选择。

于 2013-04-03T10:30:50.643 回答
0

未经测试,

您需要更改您的 SQL 查询

select * from TotalBill 
    where SaudaDate >=@yourDateFrom 
AND SaudaDate<=@yourDateTo
于 2013-04-03T10:46:25.473 回答