0

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

我想使用 dataset.tables["Leave"].Select() 方法仅获取员工在一个月内的休假。

我认为最好的方法是使用两个间隔,即 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 + "#" + "'");

有人可以帮我弄这个吗 ???

4

3 回答 3

2

使用 DataSets 和 DataTables 意味着您不会(或不再)绑定到数据库或特定的 SQL 方言。

与 DataTable.Select() 方法一起使用的语法记录在MSDN上。

对于日期(显然,如果列类型是 REALLY DateTime)使用类似于 MS Access(# 分隔)的语法,因此您可以编写:

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

使用引号很重要(如@Waqas 代码):

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

因为导致:System.FormatException:字符串未被识别为有效的日期时间。

我的建议是使用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);
于 2013-01-24T23:36:35.017 回答
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 + "#)");
于 2013-01-24T19:14:49.607 回答
0

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

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

这消除了对 MS Access 的所有日期处理并避免了很多问题。

于 2013-01-24T21:36:28.650 回答