查询同一天的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行。如何更改代码或查询以允许在日期选择器中选择同一天?
重要的是:
您需要参数化查询。
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