如何使用Dataset.Tables.Select方法在2个日期间隔内搜索行?

时间:2013-01-24 19:10:25

标签: c# database ms-access dataset datarow

我有一个数据库表“离开”。 它的主要关键是“LeaveNo”。 数据库中的其他字段包括“LeaveDate”,“EmpID”,“EmpName”等

我想使用dataset.tables [“Leave”]。选择()方法只获取员工在一个月内完成的叶子。

我认为最好的方法是使用两个间隔,即mm / 01/2012和mm / 31/2012 (我知道有几个月有30天)

我目前的代码是这样,它不起作用:

这只是一个测试代码...

        string moreThan = DateTime.Now.Month.ToString() + "01" + DateTime.Now.Year.ToString();
        string lessThan = DateTime.Now.Month.ToString() + "31" + DateTime.Now.Year.ToString();

        leavesthisMonth = LeaveDS.Tables["Leave"].Select("EmpID='" + txt_EmpID.Text + "' AND LeaveDate <= '" + "#" + lessThan + "#" + "'" + "AND LeaveDate >= '" + "#" + moreThan + "#" + "'");

有人可以帮我这个吗?

3 个答案:

答案 0 :(得分:2)

使用DataSet和DataTable意味着您不受数据库或特定SQL方言的约束(或者不再约束)。

MSDN记录了DataTable.Select()方法使用的语法。

对于日期(显然,如果列类型为REALLY DateTime)使用类似于MS Access(#delimited)的语法,那么您可以写:

var rows = dt.Select("LeaveDate > #2013-01-01#");

NOT 使用引号很重要(如@Waqas代码中所示):

var rows = dt.Select("LeaveDate > '#2013-01-01#'");   // ERROR

因为结果:System.FormatException:String未被识别为有效的DateTime。

我的建议是使用 yyyy-MM-dd 格式,因为设计文化不变。

使用特定语法构建字符串的一种好方法是使用String.Format(或任何变体)以清除原因,并让DateTime类型执行所有特定日期数学。

int month = 10;

var begin = new DateTime(DateTime.Today.Year,month,1); // first day of a month
var end = begin.AddMonths(1); // first day next month 

var format = "LeaveDate >= #{0:yyyy-MM-dd}# AND LeaveDate < #{1:yyyy-MM-dd}#";

var condition = String.Format(format,begin,end);

rows = dt.Select(condition);

答案 1 :(得分:1)

注意您的运营商<= LeaveDate and >= LeaveDate

操作员应该像>= LeaveDate and <= LeaveDate

LeaveDate 应该像LeaveDate.ToString("dd MMM yyyy")LeaveDate.ToString("dd/mm/yyyy")

leavesthisMonth = LeaveDS.Tables["Leave"].Select("EmpID='" + txt_EmpID.Text + "' AND (LeaveDate >= #" + lessThan + "# AND LeaveDate <= #" + moreThan + "#)");

答案 2 :(得分:0)

通过在SQL中使用Date(),可以使整个事情变得更容易:

 WHERE Month(LeaveDate)=Month(Date()) AND Year(LeaveDate)=Year(Date())

删除了对MS Access的所有日期处理,避免了很多问题。