0

データベーステーブル「Leave」があります。その主キーは「LeaveNo」です。データベースの他のフィールドには、「LeaveDate」、「EmpID」、「EmpName」などが含まれます

dataset.tables["Leave"].Select() メソッドを使用して、従業員が 1 か月に行った休暇のみを取得したいと考えています。

私が考え出した最善の方法は、2 つの間隔、つまり 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: 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);
于 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 に答える