0

OleDbを使用してAccess2010データベースに接続するC#WinFormsアプリで使用される次のコマンドがあります。

oc_payslips = new OleDbCommand("SELECT <fields> FROM Payslips WHERE LicenseID = \"" + IDs[cb_Employees.SelectedIndex] + "\" AND DateOfPayment >= \"" + startDate + "\" AND DateOfPayment <= \"" + endDate + "\"", DB_Connection.con); 

これは機能しません。私の推測では、SQLを使用してそのような2つの文字列を比較することはできません。

アイデアは、2つの日付の間の日付を持つレコードを取得することです。これらはすべて「dd / MM/yyyy」形式です。日付はデータベースに文字列として保存されます。

インターネットでこれに対する答えを見つけることができなかったので、ここに私の質問があります:

SQLを使用して2つの文字列を比較し、どちらがアルファベット順で最初であるかを判断する方法はありますか?

PS:最初にすべての日付を取得し、それらを比較してから、正しい日付を持つIDを検索できることはわかっていますが、私の質問は、単一のSQLクエリでこれを行うことに関連しています。

4

2 に答える 2

2

あなたはいくつかの問題を抱えています

  • 文字列連結を使用する代わりに、パラメータ化されたコマンドを使用する必要があります。

  • SQL の文字列区切り文字として、一重引用符ではなく二重引用符を使用しています。

  • 日付を文字列として比較しています。テーブル フィールドのタイプが のDate/Time場合、日付リテラルを使用する必要があります (文字列連結を使用し続ける場合)。日付が「dd/MM/yyyy」のような形式の文字列として保存されている場合、比較は機能しません。

  • と同じことLicenseID。数値型の場合はLicenseID = 123notと比較しますLicenseID = "123"

パラメーター化されたクエリを使用すると、最後の 3 つの問題は自動的に解消されます。

参照: MSDNでパラメーター化されたクエリを実行する方法。


oc_payslips = new OleDbCommand(
    @"SELECT <fields> FROM Payslips
      WHERE LicenseID = @lid AND
      DateOfPayment >= @start AND DateOfPayment <= @end", DB_Connection.con); 

oc_payslips.Parameters.AddWithValue("@lid", IDs[cb_Employees.SelectedIndex]);
oc_payslips.Parameters.AddWithValue("@start", startDate);
oc_payslips.Parameters.AddWithValue("@end", endDate);
...

日付を文字列としてデータベースに保存するのはお勧めできません。文字列として保存された日付を比較したい場合は、Vlad Schnakovszki がコメントで指摘したように、文字列が「yyyy/MM/dd」としてフォーマットされている場合にのみ機能します。ただし、使用しようとすることができます

"... CDate(DateOfPayment) BETWEEN @start AND @end"

type のパラメーターを渡すようにしてくださいDateTime

于 2012-05-18T22:09:53.220 に答える
0

http://www.tutorialspoint.com/sql/sql-string-functions.htm#function_strcmp

Afaikが-1を返す場合、英語のアルファベットを使用して最初の文字列が2番目の文字列の前になるよりも

于 2012-05-18T21:37:06.087 に答える