查询同一天的date from和date to不返回任何行

本文关键字:date 返回 任何行 to from 同一天 查询 | 更新日期: 2023-09-27 18:07:23

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

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行。如何更改代码或查询以允许在日期选择器中选择同一天?

查询同一天的date from和date to不返回任何行

重要的是:
您需要参数化查询。

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

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

当你说"01/01/2010"给Sql,它理解"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年2月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'

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

试试…

如果你想包含日期,那么不要使用between。使用大于/小于或等于。

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%'

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

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

您需要将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){}

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

未测试,

你需要改变你的SQL查询

select * from TotalBill 
    where SaudaDate >=@yourDateFrom 
AND SaudaDate<=@yourDateTo