日付によるBindingSourceフィルター
質問
日付に基づいてデータベースから値をフィルタリングしたい。
データベースの日付には、2008-12-28 18:00:00のような値が含まれます。そして、私のクラスには、フィルタリングしたいものに応じてDateTime変数があります。理想的には次のように動作します:
myBindingSource.Filter =" DATE(myDateField)= myDateTime.Date"
+必要に応じてmyDateTime.Date形式を調整します。
ただし、EvaluateExceptionがスローされます:"この式には未定義の関数呼び出しDATE()が含まれています。
SQLステートメントを直接実行する場合、フィルターでDATE()関数を使用できます。
PS Connector / Net 5.2でMYSQL DBを使用しています
この問題を解決するにはどうすればよいですか
ご提案ありがとうございます。
解決
getSqlDate関数は必要ありません。 String.Format()を使用して日付をフォーマットできます:
String.Format("{0:yyyy-MM-dd} 00:00:00", myDateTime)
または
myDateTime.Date.ToString("yyyy-MM-dd") + " 00:00:00"
次のようにバインディングソースをフィルタリングできます。
myBindingSource.Filter = String.Format("myDateField >= '{0:yyyy-MM-dd}' AND myDateField < '{1:yyyy-MM-dd}'", myDateTime, myDateTime.AddDays(1));
他のヒント
TomH。ありがとう。
はい、フィルターで日時の時間部分を削除したかったので、提案は完全に機能します。
他の人には完全なソリューションを残します:
myBindingSource.Filter = "myDateField >= '" + getSqlDate(myDateTime) + "' AND myDateField < '" + getSqlDate(myDateTime.AddDays(1)) + "'";
getSqlDate関数は次のとおりです。
string getSqlDate(DateTime date) {
string year = "" + date.Year;
string month = (date.Month < 10) ? "0" + date.Month : "" + date.Month;
string day = (date.Day < 10) ? "0" + date.Day : "" + date.Day;
return year + "-" + month + "-" + day + " 00:00:00";
}
myDateFieldはデータセット内のフィールドの名前ですか?次のような式が必要だと思います:
myBindingSource.Filter = "myDateField = " & myDateTime.Date.ToString()
フィルターで日時の時刻部分を削除する方法を尋ねていますか?私はMySQLにあまり馴染みがありませんが、datetimeの日付部分を返す何らかの種類の関数を使用すると、その列のインデックス(既存または将来のインデックス)を使用する可能性がなくなります。
最善の方法は、特定のフィルター日付のみの範囲をチェックするフィルターをフロントエンドに作成することです。例:
myBindingSource.Filter = "myDateField >= " & <code to create a string representing 12AM of your date> &
" myDateField < " & <code to create a string for 12AM of the next day>
正確なコードを持っていないことを申し訳ありませんが、私はSQL開発者であり、VB / C#スキルが不足しているため、関数を考え出すのにもっと時間がかかり、おそらくあなたを連れて行くでしょう。 :)
DataGridViewの2つの日付間の検索には、次のコードを使用できます。
BindingSource1.Filter = "F5 >= '" + maskedTextBox1.Text + "' And " + "F5 <= '" + maskedTextBox2.Text + "'";
BindingSource1:BindingSource1でのdatagridview datasourcのロード。 F5:datagridviewのヘッダー列の名前。 maskedTextBox1:最初の日付を取得します。 maskedTextBox2:2番目の日付を取得します。
成功する&quot; Arn_7&quot;
DataGridViewの2つの日付間の検索には、次のコードを使用できます。
BindingSource1.Filter = "F5 >= '" + maskedTextBox1.Text + "' And " + "F5 <= '" + maskedTextBox2.Text + "'";
BindingSource1 : my datagridview datasourc load in BindingSource1 .
F5 : name of your header column in datagridview .
maskedTextBox1 : for get first date .
maskedTextBox2 : for get second date .