使用SQL比较两个字符串

时间:2012-05-18 21:31:46

标签: sql ms-access ms-access-2010

我有以下命令,在使用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并确定哪个字母顺序排在第一位?

P.S。:我知道我可以先获取所有日期,比较它们,然后搜索具有正确日期的ID,但我的问题与在单个SQL查询中执行此操作有关。

2 个答案:

答案 0 :(得分:2)

你有几个问题

  • 您应该使用参数化命令而不是使用字符串连接。

  • 您在SQL中使用双引号而不是单引号作为字符串分隔符。

  • 您正在将日期比较为字符串。如果类型为Date/Time的表字段,则必须使用日期litterals(如果您坚持使用字符串连接)。如果日期存储为格式为“dd / MM / yyyy”的字符串,则比较将无效。

  • LicenseID相同。如果是数字类型,则比较LicenseID = 123而不是LicenseID = "123"

如果您使用参数化查询,则最后三个问题会自动消失。

请参阅MSDN上的How to: Execute a Parameterized Query


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类型的参数。

答案 1 :(得分:0)

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

afaik如果它返回-1而不是第一个字符串将在第二个字符串之前使用英文字母