0

我有以下命令,在使用 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 查询中执行此操作有关。

4

2 回答 2

2

你有几个问题

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

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

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

  • LicenseID. 如果是数字类型,LicenseID = 123则不比较LicenseID = "123"

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

请参阅:如何:在 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);
...

将日期作为字符串存储在数据库中是一个坏主意。如果您想比较存储为字符串的日期,则仅当字符串格式为“yyyy/MM/dd”时才有效,正如 Vlad Schnakovszki 在他的评论中指出的那样。但是,您可以尝试使用

"... 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 if it returns -1 than the first string would be before the second using english alphabet

于 2012-05-18T21:37:06.087 回答