查询日期和日期到同一天不返回任何行

时间:2013-04-03 10:15:17

标签: c# sql datetime

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

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中选择同一天?

5 个答案:

答案 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