[英]Comparing two strings using SQL
我有以下命令,在使用OleDb連接到Access 2010數據庫的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的兩個字符串。
我們的想法是獲取兩個日期之間的日期記錄,所有日期都具有“dd / MM / yyyy”格式。 日期作為字符串存儲在數據庫中。
我在網上找不到答案,所以這是我的問題:
有沒有辦法比較使用SQL的兩個字符串,並確定哪個是按字母順序排在第一位?
PS:我知道我可以先獲取所有日期,比較它們然后搜索具有正確日期的ID,但我的問題與在單個SQL查詢中執行此操作有關。
你有幾個問題
您應該使用參數化命令而不是使用字符串連接。
您在SQL中使用雙引號而不是單引號作為字符串分隔符。
您將日期比較為字符串。 如果表字段的類型為Date/Time
,則必須使用日期litterals(如果您堅持使用字符串連接)。 如果日期存儲為格式為“dd / MM / yyyy”的字符串,則比較將不起作用。
LicenseID
。 如果是數字類型,則比較LicenseID = 123
而不是LicenseID = "123"
。
如果使用參數化查詢,則最后三個問題會自動消失。
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);
...
將日期作為字符串存儲在數據庫中是一個壞主意。 如果你想比較存儲為字符串的日期,只有當字符串被格式化為“yyyy / MM / dd”時才會起作用,正如Vlad Schnakovszki在他的評論中指出的那樣。 但是,您可以嘗試使用
"... CDate(DateOfPayment) BETWEEN @start AND @end"
並確保傳遞DateTime
類型的參數。
http://www.tutorialspoint.com/sql/sql-string-functions.htm#function_strcmp
afaik如果它返回-1而不是第一個字符串將在第二個字符串之前使用英文字母
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.