我有一个数据库表“离开”。 它的主要关键是“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 + "#" + "'");
有人可以帮我这个吗?
答案 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的所有日期处理,避免了很多问题。