我有两个日期选择器,其日期将在此查询中使用:
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行。如何更改我的代码或查询以允许在datepickers中选择同一天?
答案 0 :(得分:3)
首先重要:
You need parametrized query.
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&#39之间的所有数据;和' 1/3/2013' 00:00:00&#39 ;.在纯英语中,您将获得当天1/2/2013的所有数据。
答案 1 :(得分:1)
如果您希望包含日期,请不要在两者之间使用。使用大于/小于或等于。
select * from totalbill where SaudaDate >= '2013-02-01' and SaudaDate <= '2013-02-01'
编辑。如果您的日期列实际上是日期时间不是00:00:00.000,那么您需要在单个日期的位置使用“赞”。
select * from totalbill where SaudaDate like '2013-02-01%'
或者您需要以编程方式将第一天添加到第二个日期。
select * from totalbill where SaudaDate >= '2013-02-01' and SaudaDate <= '2013-02-02'
答案 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'
现在它将为您提供所需的结果..
试试吧......
答案 3 :(得分: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){}
此代码也适用于当天的选择。
答案 4 :(得分:0)
未经测试,
您需要更改SQL查询
select * from TotalBill
where SaudaDate >=@yourDateFrom
AND SaudaDate<=@yourDateTo